调用线程时 主线程里的一条printf语句执行2次?请高手帮忙 现在小弟没分 以后会弥补的

lingang_ 2008-05-07 05:13:53
我的代码如下:


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

DWORD WINAPI ThreadFunc(LPVOID);
void AnotherFunc(void);

int main()
{
HANDLE hThrd;
int flag=0;
DWORD exitCode=0;
DWORD threadId=0;

hThrd=CreateThread(NULL,0,ThreadFunc,(LPVOID)1,0,&threadId);
flag++;
//Sleep(2000);
if(hThrd)
{
printf("launched \n");
printf("%d\n",flag);
}

for(;;)
{
BOOL rc;
rc=::GetExitCodeThread(hThrd,&exitCode);
if(rc && exitCode!=STILL_ACTIVE)
break;
}

::CloseHandle(hThrd);
printf("returned %d\n",exitCode);

return EXIT_SUCCESS;
}

DWORD WINAPI ThreadFunc(LPVOID n)
{
printf("running \n");
AnotherFunc();

return 0;
}

void AnotherFunc()
{
::ExitThread(4);
}

输出结果为:
launched
launched
running
1
returned 4

请高手帮忙 现在小弟没分 以后会弥补的!!!
...全文
109 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lingang_ 2008-05-08
  • 打赏
  • 举报
回复
再次感谢vocanicy的回答,已经搞明白了 :)
用户 昵称 2008-05-08
  • 打赏
  • 举报
回复
6楼说的完全对,俺虽然对多线程安全略知一二,还是表达不出6楼的意思。
vocanicy 2008-05-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lingang_ 的回复:]
呵呵 jennyvenus和vocanicy的方法都可行 谢谢2位 。那我想知道具体是什么原因导致了printf执行了2次呢??
[/Quote]

因为你原来调用的printf是非线程安全版本的C运行时库
这个版本的printf内部使用了全局的缓冲区,当另外一个线程调用时printf时,将launched重复打印了

我这里安装VC的时候没有选择装CRT的代码,你可以自己找源码确认一下
lingang_ 2008-05-07
  • 打赏
  • 举报
回复
哦 。
用户 昵称 2008-05-07
  • 打赏
  • 举报
回复
2楼说的就是原因。
lingang_ 2008-05-07
  • 打赏
  • 举报
回复
呵呵 jennyvenus和vocanicy的方法都可行 谢谢2位 。那我想知道具体是什么原因导致了printf执行了2次呢??
vocanicy 2008-05-07
  • 打赏
  • 举报
回复
改用Multithreaded多线程版本的C运行时库

在Project->Settings->C/C++->Code Generation->Multithreaded

还有几个都可以选
Multithreaded DLL
Debug Multithreaded
Debug Multithreaded DLL
用户 昵称 2008-05-07
  • 打赏
  • 举报
回复
没什么你可以在线程里面加一个sleep就可以了。

// test4.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

DWORD WINAPI ThreadFunc(LPVOID);
void AnotherFunc(void);

int main()
{
HANDLE hThrd;
int flag=0;
DWORD exitCode=0;
DWORD threadId=0;

hThrd=CreateThread(NULL,0,ThreadFunc,(LPVOID)1,0,&threadId);
flag++;
//Sleep(2000);
if(hThrd)
{
printf("launched \n");
printf("%d\n",flag);
}

for(;;)
{
BOOL rc;
rc=::GetExitCodeThread(hThrd,&exitCode);
if(rc && exitCode!=STILL_ACTIVE)
break;
}

::CloseHandle(hThrd);
printf("returned %d\n",exitCode);

return EXIT_SUCCESS;
}

DWORD WINAPI ThreadFunc(LPVOID n)
{
Sleep( 100 );
printf("running \n");
AnotherFunc();

return 0;
}

void AnotherFunc()
{
::ExitThread(4);
}

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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