请教一个有关C++多线程产生重复数据的简单例子

来源:百度知道 编辑:UC知道 时间:2024/06/30 13:44:29
我刚学C++多线程,写了段简单的代码,目的是观察让主线程和新建的线程运行情况,并带有一个初始值为100的数,每执行一次减一,代码如下:

#include "stdio.h"
#include "windows.h"

int n=100;

DWORD WINAPI FunThread(LPVOID lpParameter)
{
while(1)
{
if((n--)>0)
printf ("Thread is running !! n=%d\n",n);
else
break;
}
return 0;
}

void main()
{
HANDLE hThread;
hThread = CreateThread(NULL,0,FunThread,NULL,0,NULL);
CloseHandle(hThread);

while(1)
{
if((n--)>0)
printf("Main is running !! n=%d\n",n);
else
break;
}
}

================
运行结果中出现了重复数据:
Main is running !! n=91
Main is running !! n=90
Main is running !! n=90
Thread is running !! n=89

请问为什么同一个线程会还会出现重复数据呢??我知道应该用互斥对象来解决这个问题,但还是不理解怎么会出现重复值?我觉得漏掉某个值倒是有可能出现,重复的话是不可能出现的啊,请高手帮忙解答一下,谢谢
我刚把printf 用 cout 替换了,

两个线程共享同一会出现问题。
原理是这样的
比如数字A=100
这时候线程1和线程2都要执行 A-- 这条语句。
A--翻译成汇编是这样的:
mov ax,A
sub ax,1
mov A,ax
两个线程同时执行的时候你可以看到这样的情况
mov ax,A ;线程1,这时候ax=100,A=100
sub ax,1 ;线程1,这时候ax=99
mov ax,A ;线程2,这时候ax=100,A=100
sub ax,1 ;线程2,这时候ax=99
mov A,ax ;线程1,这时候A=99
mov A,ax ;线程1,这时候A=99
我们本来期望两个线程进行两次自减,但是结果却只减了1次。
解决方案:设置信号量就可以了~vc上有专门的api可以调用

估计是printf语句出了问题吧, 也许就是凑巧了。

printf是个不可重入的函数,在两个线程里都用printf会把缓冲搞乱掉。 你可以多运行几次试试看