iostream 与 iostream.h 在线程同步中的不同表现

Dionysos 发布于 2012/04/07 15:55
阅读 446
收藏 1

首先看一下代码,就是vc++深入详解中的一段:

#include <windows.h>
#include <iostream.h>

DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter);

int ticket = 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(ticket > 0){
   Sleep(1);
   cout << "thread1 sell ticket : " << ticket-- << endl;  
  }

  else
   break;
 }
 return 0;
}

DWORD WINAPI Fun2Proc(LPVOID lpParameter){
 while(TRUE){
  if(ticket > 0){
   Sleep(1);
   cout << "thread2 sell ticket : " << ticket-- << endl;  
  }

  else
   break;
 }
 return 0;
}

执行结果很正常;如图所示


如果我们将头文件该为:

#include <windows.h>
#include <iostream>

using namespace std;

为什么结果很杂乱无章:

有人知道为什么吗,能帮忙吗?

加载中
0
Jackarain
Jackarain

cout不是线程安全的输出, 改用printf, 就不会两个输出混乱到一起了.

0
中山野鬼
中山野鬼
.h的是C的吧。我影响中,C++的不带.h的是不同的方式,对于同样的入口有两种不同的方式实现。有段时间没碰WINDOWS的东西了。
0
Windoze
Windoze

iostream.h已经被废弃了,用iostream,当然,如果你还在用十几年前的VC6,要废弃的不是这个头文件,而是整个编译器+库

cout是线程安全的,但是并不在每次输出操作上同步,所以多线程并发输出顺序有可能会混乱。如果需要自己加个锁吧。

 

 

返回顶部
顶部