读书人

MinGW 的 cout 疑问解决方法

发布时间: 2012-03-06 20:47:55 作者: rapoo

MinGW 的 cout 疑问
同样的代码,在 VC 或者 i586-mingw32msvc-g++ 中编译可以顺利执行

但是 MinGW 下编译的话,要么执行一次 Writer 和一次 reader 后死循环了

要么执行五次 Writer 和四次 reader 后死了

编译器版本:

Perl code
VC6i586-mingw32msvc-g++ 3.4.5MinGw g++ 3.4.2


C/C++ code
#define WIN32_LEAN_AND_MEAN#include <windows.h>#include <iostream>HANDLE hMutex, hWriteDone, hReadDone;int num, state;void Writer(){  for(int x=10; x>=0; x--)  {    while (true)    {      if (WaitForSingleObject(hMutex, INFINITE) == WAIT_FAILED)      {        std::cout<<"In writing loop, no mutex!\n";        ExitThread(0);      }      if (state == 0)      {        ReleaseMutex(hMutex);        WaitForSingleObject(hReadDone, INFINITE);        continue;      }      break;    }    std::cout<<"Write done\n";    num= x;    state= 0;    ReleaseMutex(hMutex);    PulseEvent(hWriteDone);  }}void Reader(){  while(true)  {    if (WaitForSingleObject(hMutex, INFINITE) == WAIT_FAILED)    {      std::cout<<"In reader, no mutex!\n";      ExitThread(0);    }    if (state == 1)    {      ReleaseMutex(hMutex);      WaitForSingleObject(hWriteDone, INFINITE);      continue;    }    if (num == 0)    {      std::cout<<"End of data\n";      ReleaseMutex(hMutex);      ExitThread(0);    }    else {      std::cout<<"Read done\n";      state = 1;      ReleaseMutex(hMutex);      PulseEvent(hReadDone);    }  }}int main(){  HANDLE TName[2];  DWORD ThreadID;  state = 1;  hMutex = CreateMutex(NULL, FALSE, NULL);  hWriteDone = CreateEvent(NULL, TRUE, FALSE, NULL);  hReadDone = CreateEvent(NULL, TRUE, FALSE, NULL);  TName[0] = CreateThread(NULL,                          0,                          (LPTHREAD_START_ROUTINE)Writer,                          NULL,                          0,                          &ThreadID);  TName[1] = CreateThread(NULL,                          0,                          (LPTHREAD_START_ROUTINE)Reader,                          NULL,                          0,                          &ThreadID);  WaitForMultipleObjects(2, TName, TRUE, INFINITE);  CloseHandle(TName);  return 0;}




[解决办法]
将创建线程改为_beginthreadex之后 运行了N次没出现问题.

C/C++ code
#define WIN32_LEAN_AND_MEAN#include <windows.h>#include<process.h>#include <iostream>HANDLE hMutex, hWriteDone, hReadDone;int num, state;unsigned int __stdcall Writer(void*){  for(int x=10; x>=0; x--)  {    while (true)    {      if (WaitForSingleObject(hMutex, INFINITE) == WAIT_FAILED)      {        std::cout<<"In writing loop, no mutex!\n";        ExitThread(0);      }      if (state == 0)      {        ReleaseMutex(hMutex);        WaitForSingleObject(hReadDone, INFINITE);        continue;      }      break;    }    std::cout<<"Write done\n";    num= x;    state= 0;    ReleaseMutex(hMutex);    PulseEvent(hWriteDone);  }  return 0;}unsigned int __stdcall Reader(void*){  while(true)  {    if (WaitForSingleObject(hMutex, INFINITE) == WAIT_FAILED)    {      std::cout<<"In reader, no mutex!\n";      ExitThread(0);    }    if (state == 1)    {      ReleaseMutex(hMutex);      WaitForSingleObject(hWriteDone, INFINITE);      continue;    }    if (num == 0)    {      std::cout<<"End of data\n";      ReleaseMutex(hMutex);      ExitThread(0);    }    else {      std::cout<<"Read done\n";      state = 1;      ReleaseMutex(hMutex);      PulseEvent(hReadDone);    }  }  return 0;}int main(){  HANDLE TName[2];  DWORD ThreadID;  state = 1;  hMutex = CreateMutex(NULL, FALSE, NULL);  hWriteDone = CreateEvent(NULL, TRUE, FALSE, NULL);  hReadDone = CreateEvent(NULL, TRUE, FALSE, NULL);  TName[0] = (HANDLE)_beginthreadex(NULL,                          0,                          Writer,                          NULL,                          0,                          0);  TName[1] = (HANDLE)_beginthreadex(NULL,                          0,                          Reader,                          NULL,                          0,                          0);  WaitForMultipleObjects(2, TName, TRUE, INFINITE);  CloseHandle(TName);  return 0;} 


[解决办法]
焦...

void Writer()
这个能作CreateThread的线程函数吗?

另外, LZ这点代码还不至于在多线程里让CRT崩掉。

读书人网 >C++

热点推荐