我写的程序如下:
______________________________________________________
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc( LPVOID lpParameter )
{
char c = (int)lpParameter;
for( int i = 0; i < 100; i++ )
{
cout << c;
cout.flush();
}
return 1;
}int main()
{
HANDLE hThread1;
HANDLE hThread2; hThread1 = CreateThread( NULL, 0, Fun1Proc, (LPVOID)'a', 0, NULL );
hThread2 = CreateThread( NULL, 0, Fun1Proc, (LPVOID)'b', 0, NULL ); WaitForSingleObject( hThread1, INFINITE );
CloseHandle( hThread1 );
WaitForSingleObject( hThread2, INFINITE );
CloseHandle( hThread2 );     return 0;
}
_______________________________________________________________________________________
本来期望的效果是两个线程一个输出a,一个输出b,但现在的情况是输出一部分,就提示如下:
"0x00404446"引用的"0x00000000"内存,该内存不能为"read"这个提示出现的时间是不确定的,有时候只输出几个字符就出现了,有时候输出很多才出现。而且会出现到了后半段只输出a或b的情况。

解决方案 »

  1.   

    wait Thread1的时候,Thread2都可能已经结束了
      

  2.   

    VC6关于cout的实现可能不是线程安全的。LZ最好不要用VC6研究C++。它跟现在的C++标准差异也比较大。iostream.h在后续版本已经被抛弃。换成iostream。你在代码在VS2005上面测试没有任何问题。
      

  3.   

    LZ可以跟到cout实现文件里面去。搜索lock如果没有lock基本上可以肯定他不是线程安全的。
    2005是有lock的。
      

  4.   

    cout < < c; 
    cout.flush(); 
    不安全!
      

  5.   


    即使线程已经结束了,线程的HANDLE没有关闭,那线程的内核对象就依旧有效,只是状态为运行完了。知道CloseHandle的调用,该线程的内核对象才会被销毁。TO: 楼主
    我在VC6.0下测试了楼主的程序,好像没有错误,能够正常运行。楼主请确认一下你的环境,或者你的Source是否原封未动的贴出来了。
      

  6.   

    没问题了。我把#include "iostream.h"改成#include "iostream",然后加上using namespace std;
    就没错了。
      

  7.   

    cout 是单独的一个对象, 多线程对同一对象的访问是要加锁的。如果这个对象本身没有实现锁机制,那么我们就说这个对象不是线程安全的。