首页
社区
课程
招聘
线程的疑惑
发表于: 2008-7-3 12:38 5861

线程的疑惑

2008-7-3 12:38
5861
小弟刚学习多线程编程。
写了一个简单的多线程程序。
#include<iostream.h>
#include<windows.h>
DWORD WINAPI ThreadFun(LPVOID arg);
DWORD i=0;
void main()
{
   HANDLE thread;
   DWORD threadid;
   thread=CreateThread(0,0,ThreadFun,&i,0,&threadid);
   cout<<"main thread"<<j++<<endl;
   Sleep(1000);
   CloseHandle(thread);
}
DWORD WINAPI ThreadFun(LPVOID arg)
{
    cout<<"my thread"<<i++<<endl;
    return 0;
}

这个程序输出的两个结果是
1.
my thread0
my thread0
main thread
Press any key to continue
2.
main thread
main thread
my thread0
Press any key to continue
请问1中my thread0出现两次是怎么造成的。
    同样的问题出现在2中。
最好能把线程的大概执行路径说一下。
谢谢。急需!!!

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 7
支持
分享
最新回复 (9)
雪    币: 259
活跃值: (26)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
2
还出现了这个情况

main threadmy thread0
1
main threadmy thread0

时间片的轮转问题
2008-7-3 18:11
0
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
3
是有点古怪,所以线程里面要加锁。

理论上不会产生0出现2次的情况,因为
1.只存在2个线程
2.即使重入线程2,也不会出现2次都为0的结果。

同时也从反面说明了,对公共变量i的直接访问和修改是不安全的。
2008-7-3 18:26
0
雪    币: 259
活跃值: (26)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
4
建议看一下操作系统的书,单核和双核的运行结果肯定也是不一样的,至于为什么会有多个main,实在是说不清楚,希望大侠能解释解释
2008-7-3 22:51
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
5
这应该不是线程的问题,而是控制台应用程序的输出机制在多线程环境下出了问题。

cout 是具有缓冲的,也就是说数据并不立即呈现,等数据达到一定量或者一定时间后才显示到窗口并清除缓冲区。而cerr是即时输出。
如果把cout改成cerr那应该就没问题了。
2008-7-3 23:04
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
6
VS2005中看不到这种现象,而VC6有这种现象。改成cerr还是有问题

例如对于下面这中情况,
my thread 0
my thread 0
main thread 1
Press any key to continue

虽然my thread 输出两次,但记数只修改1次。
可以确定是输出缓冲机制的问题,但具体细节我也搞不清了。

标记标记!很好的问题啊。有待继续研究!
楼下的继续补充啊!
2008-7-3 23:24
0
雪    币: 103
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
也帮你顶个吧,等待解答我的问题
2008-7-3 23:26
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
8
顶。LS的LS 。。。学习。
(晕  本来是LS 结果发帖的时候多出了一个贴子,,整死!)

cout<<"main thread"<<j++<<endl;
我也不知道LZ 是如何编译通过这句的  

VS2008 中很不幸没有遇到这么一个问题  测试Okay。如果把 j 改成 i 的话。不排除我错误理解了LZ的意思。
2008-7-3 23:26
0
雪    币: 259
活跃值: (26)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
9
可能缓冲中有一个标记,就是是否已经被输出
而这个程序是多线程,因为是在控制台,不排除他们使用的是同一个缓冲区
当新线程执行的时候,本来main中刚好输出完,但没有及时清空缓冲,标记也没变成已输出,
然后由于时间片的轮转, 那么新线程的cout会将main中的缓冲再次的输出一次并清理
2008-7-4 09:30
0
雪    币: 259
活跃值: (26)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
10
刚才做了个实验,好像就像我上面说的,如果把
cout<<"main thread"<<i++<<endl;
注释掉,则不会重复出现两次main

oh yeah 找到答案了,新亏北极星想到了是输出缓存的问题
2008-7-4 09:32
0
游客
登录 | 注册 方可回帖
返回
//