求助 线程同步中 关于双核的问题
编了一段关于线程同步的代码,在单核的机器上用mutex可以相互锁住,但是在双核的机器上还是会互相干扰。
有什么好的办法让两个cpu在这个程序里能同步?这种情况是怎么造成的呢?
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
volatile int accnt1 = 0;
volatile int accnt2 = 0;
HANDLE hMutex;
DWORD WINAPI run1(LPVOID p){
int counter = 0;
int tmp1, tmp2, r;
do{
WaitForSingleObject(hMutex, INFINITE);
tmp1 = accnt1;
tmp2 = accnt2;
r = rand();
accnt1 = tmp1 + r;
accnt2 = tmp2 - r;
counter ++;
ReleaseMutex(hMutex);
}while(accnt1 + accnt2 == 0);
printf("%d\n",counter);
}
DWORD WINAPI run2(LPVOID p){
int counter = 0;
int tmp1, tmp2, r;
do{
WaitForSingleObject(hMutex, INFINITE);
tmp1 = accnt1;
tmp2 = accnt2;
r = rand();
accnt1 = tmp1 + r;
accnt2 = tmp2 - r;
counter ++;
ReleaseMutex(hMutex);
}while(accnt1 + accnt2 == 0);
printf("%d\n",counter);
}
int main(){
hMutex = CreateMutex(NULL,FALSE,NULL);
CreateThread(NULL,0,run1,NULL,0,NULL);
CreateThread(NULL,0,run2,NULL,0,NULL);
system("pause");
return 0;
}
结果是开始能看出来有3个线程,不一会儿就成两个了。应该是一个主线程和一个子线程。另外一个线程结束。
说明两个子线程有交叉。
[ 本帖最后由 zrl1986 于 2008-4-26 12:58 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
把你的测试和测试结果发出来,只是这样说没有证据。
代码贴上了,大家帮忙看看吧
改天找个双核的机器试试看呵呵
testcase应该写的更能说明问题
比方
printf("run1:%d\n",counter);
[ 本帖最后由 cjaizss 于 2008-4-26 13:43 编辑 ]
问题出在这句:
WaitForSingleObject(hMutex, INFINITE);
不要在不同的线程里等待同样的事件或信号,这样结果不可控,也不可预料 。
这样用也许你有特殊的考虑,如果有就补充上来.
[ 本帖最后由 system888net 于 2008-4-26 18:21 编辑 ]
支持楼上的,两个线程同时等待一个mutex,并都对这个mutex进行修改。这样做是很危险的,会导致不可预测的错误发生。
这个代码在单核的机器上也无法保证正确运行。
while(accnt1 + accnt2 == 0)并非一条指令
.......都并非一条指令
另外,
回复 #7 lingyer 的帖子
mutex不是拿来做这个的,难道是拿来做别的事情的??
hMutex是可以保护单CPU下的线程同步,但不能保护多CPU下的线程同步,关键还在于WaitForSingleObject这个函数上,它不能保证在多CPU下的线程同步,要保证多CPU下线程的同步可以使用如CCriticalSection之类的线程同步类,具体使用方法可以参阅msdn.
单核玩线程同步有啥意义?
楼上的哥们的说法大多有问题,线程同步问题的产生,就是应对多核CPU。