- 论坛徽章:
- 0
|
编了一段关于线程同步的代码,在单核的机器上用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 编辑 ] |
|