MinGW 的 cout 疑问

fox000002 2008-09-04 06:59:45
同样的代码,在 VC 或者 i586-mingw32msvc-g++ 中编译可以顺利执行

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

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

编译器版本:

VC6

i586-mingw32msvc-g++ 3.4.5

MinGw g++ 3.4.2


#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;
}


...全文
213 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
fox000002 2008-09-05
  • 打赏
  • 举报
回复
方向好像反了


#include <windows.h>


void hello()
{
MessageBox(NULL, "Hello MinGW!", "INFO", MB_OK|MB_ICONINFORMATION);
}

typedef void (*VOIDFUNC)(LPVOID);

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE,
LPSTR lpszCmdLine,
int nCmdShow)
{
VOIDFUNC pfun = (VOIDFUNC)hello;
pfun(NULL);
return 0;
}
fox000002 2008-09-05
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 Jinhao 的回复:]
DWORD WINAPI ThreadProc( LPVOID lpParameter);

这是原型.你看看你的writer和reader缺少了什么
你是用CreateThread,而不是用_beginthread!
[/Quote]

不是很明白,参数一个是 LPVOID,一个是 void *

因为传递的时候没有用到,强制转换后使用应该没有问题啊。

#include <windows.h>


void hello(LPVOID lpParam)
{
MessageBox(NULL, "Hello MinGW!", "INFO", MB_OK|MB_ICONINFORMATION);
}

typedef void (*VOIDFUNC)();

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE,
LPSTR lpszCmdLine,
int nCmdShow)
{
VOIDFUNC pfun = (VOIDFUNC)hello;
pfun();
return 0;
}

fox000002 2008-09-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 Jinhao 的回复:]
管你是几位的,给你说了writer原型不对,自己看看MSDN
[/Quote]

上面说了呀,void 的用法是 commom,有啥不可以的

在很多时候还是没关系的

而且运行是否通过与它根本没有关系
Jinhao 2008-09-05
  • 打赏
  • 举报
回复
DWORD WINAPI ThreadProc( LPVOID lpParameter);

这是原型.你看看你的writer和reader缺少了什么
你是用CreateThread,而不是用_beginthread!
fox000002 2008-09-05
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 Jinhao 的回复:]
......
找本书看看stack frame的内容,还有windows那个线程函数还有一个参数
[/Quote]

???
Jinhao 2008-09-05
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 fox000002 的回复:]
引用 13 楼 Jinhao 的回复:
管你是几位的,给你说了writer原型不对,自己看看MSDN


上面说了呀,void 的用法是 commom,有啥不可以的

在很多时候还是没关系的

而且运行是否通过与它根本没有关系
[/Quote]

......
找本书看看stack frame的内容,还有windows那个线程函数还有一个参数
  • 打赏
  • 举报
回复
有一个参数的话,在线程运行的时候会进行一次压栈操作,参数进栈
,而你写的无参函数返回的时候没有将栈平衡回去.
  • 打赏
  • 举报
回复
你用我之前贴的代码再试试看.
Jinhao 2008-09-04
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 fox000002 的回复:]
引用 11 楼 zmlovelx 的回复:
我的mingw运行通过


我又一次忘了自己运行的 64bit Windows
[/Quote]

管你是几位的,给你说了writer原型不对,自己看看MSDN
fox000002 2008-09-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zmlovelx 的回复:]
我的mingw运行通过
[/Quote]

我又一次忘了自己运行的 64bit Windows
帅得不敢出门 2008-09-04
  • 打赏
  • 举报
回复
我的mingw运行通过
Jinhao 2008-09-04
  • 打赏
  • 举报
回复
焦...

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

另外, LZ这点代码还不至于在多线程里让CRT崩掉。
fox000002 2008-09-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wangdeqie 的回复:]
既然有编译器运行正常,那就不你的问题了,编译器也不是十全十美的,何必叫这个真呢
[/Quote]

要是只能用 MinGW gcc3 编译,碰上这段,岂不死了
wangdeqie 2008-09-04
  • 打赏
  • 举报
回复
同样的代码,在 VC 或者 i586-mingw32msvc-g++ 中编译可以顺利执行
----------------------------------------------------------------
既然有编译器运行正常,那就不你的问题了,编译器也不是十全十美的,何必叫这个真呢
  • 打赏
  • 举报
回复
我这里也是mingw,gcc是4.2.1版的,没出现死循环.
fox000002 2008-09-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 akirya 的回复:]
将创建线程改为_beginthreadex之后 运行了N次没出现问题.
[/Quote]

是用 MinGW 编译的吗

改了之后问题还是依旧

主要是想知道会是什么原因出现死循环

问题应该是几个输出语句的问题

std::cout<<"Read done\n"
  • 打赏
  • 举报
回复
有不少函数在多线程的时候得使用C运行库的_beginthreadex或者_beginthread来启动线程.

就是因为这些函数使用了一些线程相关的东西,使用API的时候没有进行某些操作.
而_beginthreadex和_beginthread 正好做了这些操作.
  • 打赏
  • 举报
回复
将创建线程改为_beginthreadex之后 运行了N次没出现问题.

#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;
}
星羽 2008-09-04
  • 打赏
  • 举报
回复
木有mingw,up
fox000002 2008-09-04
  • 打赏
  • 举报
回复
错了,用 i586-mingw32msvc-g++ 3.4.5 编译的,在 wine 下正常执行

但在 WindowsXP 上执行与 MinGW 一样会死掉
加载更多回复(1)

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧