vc6上编写了个最简单的Win32 Console Application类型的多线程代码如下:(在VC2003上我把#include<iostream.h> 这句改为红色代码,其他完全一样)#include <Windows.h>                                            
#include<iostream.h>                                #include<iostream>   //VC2003 
                                                    using namespace std; //VC2003
DWORD WINAPI Fun1Proc( LPVOID lpParameter );
void main()
{
HANDLE hThead1;
hThead1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);   
CloseHandle(hThead1);
cout<<"main thread is running"<<endl;   
Sleep(10);
}
DWORD WINAPI Fun1Proc( LPVOID lpParameter )
{
cout<<"thread1 is running now"<<endl;
return 0;
}VC6上的输出结果为:
main thread is running
thread1 is running nowVC2003上输出为:
mainthread1 is runni thread is runningng now现在的问题是:2003上输出后不但单词篡位了,而且字符位置都乱了!我想知道这个是不是和我替换的红色代码有关呢?为什么呢?请大家指点!

解决方案 »

  1.   

    应该是cout不是线程安全的原因。猜测,没有做过实现。
    正好体现了多线程的并发。
      

  2.   

    VC2003中 我把 Sleep(10)去掉了,这就意味着只执行main主线程,不执行其他线程,它的输出应该是main thread is running 才对啊, 可现在仍旧是:mainthread1 is runni thread is runningng now !这不证明了:我本意是除了主线程我不让它执行别的线程,可它仍旧在执行!请问这是怎么回事?
      

  3.   

    CloseHandle(hThead1); 
    Sleep(10);
    cout < <"main thread is running" < <endl;  这样就不会出问题了.
      

  4.   

    zhangshourui :你的方法不错,的确这么一改就好了!但是我还有个问题啊,当我不让主线程睡眠时,下面的新线程是不可以执行的啊,但从乱码看来,依然执行了,请问这是怎回事?
      

  5.   

    我用的是vc2005,结果:main thread is runningthread1 is running now
      

  6.   

    我用楼主的程序在vc6上试验了一下,怎么结果是:
    main thread is running
    main thread is running  
    thread1 is running now
    这是怎么回事?
      

  7.   

    本题的最终答案是:vc6上代码如下:(在VC2003上我把#include <iostream.h> 这句改为红色代码,其他完全一样) #include <Windows.h>                                            
    #include <iostream.h>                                #include <iostream>  //VC2003 
                                                         using namespace std; //VC2003 
    DWORD WINAPI Fun1Proc( LPVOID lpParameter ); 
    void main() 

       HANDLE hThead1; 
       hThead1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);  
       CloseHandle(hThead1); 
       Sleep(10); 
       cout < <"main thread is running" < <endl;  

    DWORD WINAPI Fun1Proc( LPVOID lpParameter ) 

       cout < <"thread1 is running now" < <endl; 
       return 0; 
    } VC6上的输出结果为(正确): 
    main thread is running 
    thread1 is running now VC2003上输出为(正确): 
    main thread is running 
    thread1 is running now 
      

  8.   

    谁说你不sleep 新线程就不执行了?
      

  9.   

    多线程的时候 还是用同步手段比较安全。比如// Global variable
    CRITICAL_SECTION CriticalSection; void main()
    {
        ...    // Initialize the critical section one time only.
        if (!InitializeCriticalSectionAndSpinCount(&CriticalSection, 
            0x80000400) ) 
            return;
        ...    // Release resources used by the critical section object.
        DeleteCriticalSection(&CriticalSection)
    }DWORD WINAPI ThreadProc( LPVOID lpParameter )
    {
        ...    // Request ownership of the critical section.
        EnterCriticalSection(&CriticalSection);     // Access the shared resource.    // Release ownership of the critical section.
        LeaveCriticalSection(&CriticalSection);    ...
    }
      

  10.   


      "不sleep 新线程就不执行" 这句话我没有表达清楚,应该是:    不调用sleep时,主线程的入口函数main中,当调用第2行代码创建线程后,就会接着执行下一行代码,即调用CloseHandle函数关闭线程句柄,之后就执行第4行代码,输出一句话,然后该函数就退出了,也就是说主线程执行完成了,当主线程执行完毕后,进程也就退出了,这时进程中所有的资源,包括还没有执行的新线程都要退出,也就是说新线程还没有机会执行就退出了,新线程就不知行了!    因为sleep(10)是让主线程暂停运行10ms,使其放弃执行的权利,操作系统就会选择下来的新线程让其运行,当该线程运行完成后,或者10ms间隔时间已过,主线程就会恢复运行,main函数退出,进程结束了!
      

  11.   

    就算主线程不Sleep,在主线程结束前,子线程也可能已经执行,这取决于系统调度,两线程同时输出,打印乱序很正常。
      

  12.   

    不关同步的事。console窗口内部有锁,本身就是线程安全的,不同线程输出到console中的文本流都是排队输出的,当一个线程正在输出时,另一个线程的输出在队列中等待,直到前一个输出完成。
    出现楼主说的内容被截断的原因只有一个:线程自身强行终止了输出过程。文本流已经全部进入管道中排队,接着线程退出,在控制台窗口还未处理完文本流上屏时收到线程终止信号,所以强行终止了实际上屏过程,未及处理的内容全部丢弃,接着处理队列中其他线程的输出内容。