全部代码
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
int index=0;
void main()
{
HANDLE hThread1;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
CloseHandle(hThread1);
while(index++<1000)
{
  cout<<"11111111111"<<endl;
}
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
while(index++<1000)
{
  cout<<"222222222222"<<endl;
}
return 0;
}

解决方案 »

  1.   

    谢谢大家的关注
    就是在  执行cout时  输出了两遍如
    111111111111122222222222222
    1111111111111
    111111111111122222222222222
      

  2.   

    是  vc6  我在vc8下也运行了  也不正常说明是函数Createthread的问题  我查了一下
     因为在C的库中有全局变量,这样用C的库时,如果程序中使用了标准的C的库时,就很容易导致运行不正常,会引起很多的冲突。所以,微软和Borland都对C的库进行了一些改进。但是这个改进的一个条件就是,如果一个线程已经开始创建了,就应该创建一个结构来包含这些全局变量,接着把这些全局变量放入线程的上下文中和这个线程相关起来。这样,全局变量就会依赖于这个线程,不会引起冲突。 
       可是我看孙鑫的教程  他的执行很正常
      

  3.   

     我百度了一下  createthread因为在C的库中有全局变量,这样用C的库时,如果程序中使用了标准的C的库时,就很容易导致运行不正常,会引起很多的冲突。所以,微软和Borland都对C的库进行了一些改进。但是这个改进的一个条件就是,如果一个线程已经开始创建了,就应该创建一个结构来包含这些全局变量,接着把这些全局变量放入线程的上下文中和这个线程相关起来。这样,全局变量就会依赖于这个线程,不会引起冲突。 
      

  4.   

    你们执行一下这个就会发现错误
    #include <windows.h>
    #include <iostream.h>
    DWORD WINAPI Fun1Proc(LPVOID lpParameter);
    void main()
    {
    HANDLE hThread1;
    hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
    CloseHandle(hThread1);
        cout<<"main is run"<<endl;

    }
    DWORD WINAPI Fun1Proc(LPVOID lpParameter)
    {
      cout<<"thread1 is run"<<endl;
         return 0;
    }
      

  5.   

    向立天老师  我不是想让它按照我的预期输出   程序全代码
    #include <windows.h>
    #include <iostream.h>
    DWORD WINAPI Fun1Proc(LPVOID lpParameter);
    int i=100;
    void main()
    {
    HANDLE hThread1;
    hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
    CloseHandle(hThread1);
    while(i-->0)
        cout<<"main is run"<<endl;
    }
    DWORD WINAPI Fun1Proc(LPVOID lpParameter)
    {
    while(i-->0)
      cout<<"thread1 is run"<<endl;
         return 0;
    }
    执行结果的图片 不知道怎么发上来   请您亲自执行以下了
      

  6.   

    上网搜了一下  说是cout是不安全的  可是我用printf也存在同样问题  那该怎么办  在cout上加个锁???  上面的代码 是我在看孙鑫的教程时 跟着他做的  他演示的没问题 也没提到cout的安全问题 
    到底是怎么回事    大师指教
      

  7.   

    用printf与cout是一样的,都是往stdout这个文件里写。两个进程都往一个stdout里写东西,出现这样的现像很正常啊。问题是你到底想达到什么目的,才好提解决方案啊。
      

  8.   

    我做了一个模拟火车买票的程序    因为在控制台下 用到输出函数  说以导致运行不正常 输出不正常
    全部代码如下  请大师调试一下 就看出问题了
    #include<windows.h>
    #include<iostream.h>
    DWORD WINAPI Fun1Proc(LPVOID lpParameter);
    DWORD WINAPI Fun2Proc(LPVOID lpParameter);
    int index=0;
    int tickets=100;
    void main()
    {
    HANDLE hThread1;
    HANDLE hThread2;
    hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
        hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
        CloseHandle(hThread1);
    CloseHandle(hThread2);
    Sleep(4000);
    }
    DWORD WINAPI Fun1Proc(LPVOID lpParameter)
    {
    while(TRUE)
    {
            if(tickets>0)
    {
    Sleep(1);
    cout<<"thread1 sell ticket : "<<tickets--<<endl;
    }
    else
    break;
    }
    return 0;
    }
    DWORD WINAPI Fun2Proc(LPVOID lpParameter)
    {
    while(TRUE)
    {
            if(tickets>0)
    {

    cout<<"thread2 sell ticket : "<<tickets--<<endl;
    }
    else
    break;
    }
    return 0;
    }
    结果的图片我整不上去  麻烦大家试一下了
      

  9.   

    我运行了一下
    debug环境下只输出main is run
    release环境下有输出thread1 is run的情况
    没有发现混乱的迹象
    我的系统是windows 8消费者预览
    IDE是VS2008
    不知道你还想知道什么信息
    我个人认为大家应该把问题说的很清楚了
    如果只为了理论研究你现在做的已经很好了
    如果是为了实际应用那没有必要纠结于这个问题
      

  10.   

    向立天老师  很感谢您能亲自调试   我想再问您最后一个问题   我把问题描述一下
      1.您测试的我那个程序  出现thread1 is run  vc6.0下  
        不管是release下还是debug  概率大概是0.2
      2.它出现thread1 is run 它就不对  主线程很短 就输出main is run 就到退出的时候了 
         thread1  根本就没机会执行
      3.为了验证  我做了一个模拟买火车票的程序  这样两个线程就会有交互运行的机会
         我发现 一旦运行到 cout....时间片就到了   说以俩个线程不是按时间片转换的
         是按在调用 cout的地方转换的
       4.假如在程序中不用cout  线程是按时间片转换的
       5.它在cout 转换的时候 也不这行 cout 而是在下一个线程的cout出执行 
         这样会出现 thread1 sell ticket : thread2 sell ticket : 3 4
       6.就算这样  为什么换行符“endl”没有输出  且数字 放到一起输出
       7. 我想做一个聊天室的程序  用到cout  所以避免不了
           就像火车票程序  总不能1线程买一张 2线程买一张  我想让它按时间片轮转
           并且输出的规律  不要出现thread1 sell ticket:thread2 sell ticket : 3 4这种情况
       8.不知道我的问题描述清楚了没有
        请您在帮我最后一次
         希望您能执行一下 上面的两个程序  执行完  我想您也知道我想问什么了
          火车票系统        还有一个是为了验证它在cout出转换了  俩个程序全部代码在下面
         #include<windows.h>
    #include<iostream.h>
    DWORD WINAPI Fun1Proc(LPVOID lpParameter);
    DWORD WINAPI Fun2Proc(LPVOID lpParameter);
    int index=0;
    int tickets=100;
    void main()
    {
    HANDLE hThread1;
    HANDLE hThread2;
    hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
      hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
      CloseHandle(hThread1);
    CloseHandle(hThread2);
    Sleep(4000);
    }
    DWORD WINAPI Fun1Proc(LPVOID lpParameter)
    {
    while(TRUE)
    {
      if(tickets>0)
    {
    Sleep(1);
    cout<<"thread1 sell ticket : "<<tickets--<<endl;
    }
    else
    break;
    }
    return 0;
    }
    DWORD WINAPI Fun2Proc(LPVOID lpParameter)
    {
    while(TRUE)
    {
      if(tickets>0)
    {cout<<"thread2 sell ticket : "<<tickets--<<endl;
    }
    else
    break;
    }
    return 0;
    }
    ---------------------------------------第二个------------------------------------
    #include <windows.h>
    #include <iostream.h>
    DWORD WINAPI Fun1Proc(LPVOID lpParameter);
    int i=100;
    void main()
    {
    HANDLE hThread1;
    hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
    CloseHandle(hThread1); 
    while(i-->0)
      cout<<"main is run"<<endl;
    }
    DWORD WINAPI Fun1Proc(LPVOID lpParameter)
    {
    while(i-->0)
    cout<<"thread1 is run"<<endl;
      return 0;
    }    
      

  11.   

    cout是有缓存的,每次写之前清下缓存。但这个不是根本问题,根本问题还是要同步。清缓存用 cout.flush() 或者 cout<<flush;
      

  12.   

    说来说去还是同步的问题
    首先线程调动是系统行为
    我们干预不了
    没有什么执行到main is run时间片就没了的说法
    很可能刚刚输出main i这是系统有挂起当前线程然后调用工作线程输出thread1 is run
    而且cout类的操作是执行流控制
    一个进程内的流是统一的
    如果不做好同步流混乱这是正常的
    所谓cout不是线程安全的就是说的这个意思
      

  13.   

    谢谢像立天老师    我在看孙鑫的视频课程时 他没提到 并且他他演示的几个列子都没有出现混乱
    所以我就不理解了   谢谢大家
    结贴
    这个问题我是明白了  可还是没解决 那不会了希望老师们帮帮忙 离校后解决bugue真的很头疼
    再次感谢老师们
      

  14.   

    我觉得应该每个售票一个线程,向各自缓冲区里写信息。主线程查询各缓冲区,如果没被锁定并且有更内容,读走并清掉缓冲区,然后送到cout显示。
      

  15.   

    迫于压力 我结贴了  后来发现加上互斥对象以保证   缓冲区cout  输出是不出错了 可还是俩个线程轮流执行  不是按时间片决定的   全部代码如下   
    #include<iostream>
    #include<stdlib.h>using namespace std;
    DWORD WINAPI Fun1Proc(LPVOID lpParameter);
    DWORD WINAPI Fun2Proc(LPVOID lpParameter);
    int tickets=100;
    HANDLE hMutex;
    void main()
    {
    HANDLE hThread1;
    HANDLE hThread2;
    hMutex=CreateMutex(NULL,FALSE,NULL);
    hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
        hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
        CloseHandle(hThread1);
    CloseHandle(hThread2);
    Sleep(4000);
    system("pause");}
    DWORD WINAPI Fun1Proc(LPVOID lpParameter)
    {
    while(TRUE)
    {
    if(tickets>0)
    {
    WaitForSingleObject(hMutex,INFINITE);
    cout<<"thread1 sell ticket : "<<tickets--<<endl;
    ReleaseMutex(hMutex);
    }
    else
    break;
    }
    return 0;
    }
    DWORD WINAPI Fun2Proc(LPVOID lpParameter)
    {
    while(TRUE)
    {
         if(tickets>0)
    {
    WaitForSingleObject(hMutex,INFINITE);
    cout<<"thread2 sell ticket : "<<tickets--<<endl;
    ReleaseMutex(hMutex);
    }
    else
    break;
    }
    return 0;

    }