help!!!!!!!!一词之差。cout和printf互换怎么结果这么大相差。

guozhuyz 2008-04-06 09:20:47
#include <windows.h>
#include<stdio.h>
#include <iostream>
using namespace std;

DWORD WINAPI ThreadProc(LPVOID lpParam)
{
int i=0;
while (i<20)
{
cout<<"I am from a Thread,count="<<i++<<endl;
}
return 0;
}

int main()
{
HANDLE hThead;
DWORD dwTheadID;
//创建一个线程
hThead=CreateThread(
NULL,
NULL,
ThreadProc, //进程入口地址
NULL,
0, //指定线程立即运行
&dwTheadID);
//为什么这个cout不行,而换成printf("Now another thread has been created. ID=%d\n",dwTheadID)
//却可以输出正确的。
//在此处换cout和printf[/color[/color]]
cout<<"Now another thread has been created. ID="<<dwTheadID<<endl;
//等待新线程运行结束。
::WaitForSingleObject(hThead,INFINITE);
::CloseHandle(hThead);
return 0;
}
使用cout的输出结果
Now anothI am from a Threer thread has beenad,count=0
I am fr created. ID=3592
om a Thread,count=1
I am from a Thread,count=2
I am from a Thread,count=3
I am from a Thread,count=4
I am from a Thread,count=5
I am from a Thread,count=6
I am from a Thread,count=7
I am from a Thread,count=8
I am from a Thread,count=9
I am from a Thread,count=10
I am from a Thread,count=11
I am from a Thread,count=12
I am from a Thread,count=13
I am from a Thread,count=14
I am from a Thread,count=15
I am from a Thread,count=16
I am from a Thread,count=17
I am from a Thread,count=18
I am from a Thread,count=19
Press any key to continue

printf的输出结果

Now another thread has been created. ID=2852
I am from a Thread,count=0
I am from a Thread,count=1
I am from a Thread,count=2
I am from a Thread,count=3
I am from a Thread,count=4
I am from a Thread,count=5
I am from a Thread,count=6
I am from a Thread,count=7
I am from a Thread,count=8
I am from a Thread,count=9
I am from a Thread,count=10
I am from a Thread,count=11
I am from a Thread,count=12
I am from a Thread,count=13
I am from a Thread,count=14
I am from a Thread,count=15
I am from a Thread,count=16
I am from a Thread,count=17
I am from a Thread,count=18
I am from a Thread,count=19
Press any key to continue
为什么会出现这样的问题?
...全文
127 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
guozhuyz 2008-04-07
  • 打赏
  • 举报
回复
谢谢各位了。又学了不少东西。
晨星 2008-04-06
  • 打赏
  • 举报
回复
个人觉得没啥好奇怪的。printf和cout的内部实现不一样是完全可能的。
既然可能不一样,那么在多线程且未加锁的情况下结果不一样也是完全正常的。
过去的我 2008-04-06
  • 打赏
  • 举报
回复
这是我测试的printf
I am from a Thread,count=2
I am from a Thread,count=3
I am from a Thread,count=4
I am from a Thread,count=5
I am from a Thread,count=6
I am from a Thread,count=7
I am from a Thread,count=Now another thread has been created. ID=2208
8
I am from a Thread,count=9
I am from a Thread,count=10
I am from a Thread,count=11
I am from a Thread,count=12
I am from a Thread,count=13
I am from a Thread,count=14
I am from a Thread,count=15
I am from a Thread,count=16
I am from a Thread,count=17
I am from a Thread,count=18
I am from a Thread,count=19

也会出错,因该不是原子操作
  • 打赏
  • 举报
回复
是因为标准库是有缓冲的.
你用没有缓冲的输出试试.
abupie 2008-04-06
  • 打赏
  • 举报
回复
printf应该是原子操作。
cout只输出到流导致吧,要查查cout实现。
过去的我 2008-04-06
  • 打赏
  • 举报
回复
printf也会出错,因为那句语句不是一个原子操作吧,
把打印threadid 的任务放到WaitForSingleObject后面比较好
  • 打赏
  • 举报
回复
用_beginthreadex创建线程
再试试

使用CreateThread创建线程,有莫名其妙的问题比较正常
星羽 2008-04-06
  • 打赏
  • 举报
回复
试了,都是正确的,不果你最好这样写吧

#include <windows.h>
#include <stdio.h>
#include <iostream>
using namespace std;

DWORD WINAPI ThreadProc(LPVOID lpParam)
{
int i=0;
while (i <20)
{
cout <<"I am from a Thread,count=" <<i++ <<endl;
}
return 0;
}

int main()
{
HANDLE hThead;
DWORD dwTheadID;
//创建一个线程
cout <<"Now another thread has been created. ID=" <<dwTheadID <<endl;
hThead=CreateThread(
NULL,
NULL,
ThreadProc, //进程入口地址
NULL,
0, //指定线程立即运行
&dwTheadID);
//为什么这个cout不行,而换成printf("Now another thread has been created. ID=%d\n",dwTheadID)
//却可以输出正确的。
//在此处换cout和printf[/color[/color]]

//等待新线程运行结束。
::WaitForSingleObject(hThead,INFINITE);
::CloseHandle(hThead);
return 0;
}

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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