求助 线程同步中 关于双核的问题

发布于 2022-09-18 21:22:40 字数 2231 浏览 12 评论 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 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

笙痞 2022-09-25 21:22:40

把你的测试和测试结果发出来,只是这样说没有证据。

凉薄对峙 2022-09-25 21:22:40

代码贴上了,大家帮忙看看吧

笨死的猪 2022-09-25 21:22:40

改天找个双核的机器试试看呵呵

夜深人未静 2022-09-25 21:22:40

testcase应该写的更能说明问题
比方
printf("run1:%d\n",counter);

[ 本帖最后由 cjaizss 于 2008-4-26 13:43 编辑 ]

悸初 2022-09-25 21:22:40

原帖由 zrl1986 于 2008-4-26 11:25 发表
编了一段关于线程同步的代码,在单核的机器上用mutex可以相互锁住,但是在双核的机器上还是会互相干扰。

有什么好的办法让两个cpu在这个程序里能同步?这种情况是怎么造成的呢?

#include
#include
# ...

问题出在这句:
WaitForSingleObject(hMutex, INFINITE);
不要在不同的线程里等待同样的事件或信号,这样结果不可控,也不可预料
这样用也许你有特殊的考虑,如果有就补充上来.

[ 本帖最后由 system888net 于 2008-4-26 18:21 编辑 ]

无戏配角 2022-09-25 21:22:40

支持楼上的,两个线程同时等待一个mutex,并都对这个mutex进行修改。这样做是很危险的,会导致不可预测的错误发生。
这个代码在单核的机器上也无法保证正确运行。

度的依靠╰つ 2022-09-25 21:22:40

while(accnt1 + accnt2 == 0)并非一条指令
.......都并非一条指令
另外,
回复 #7 lingyer 的帖子
mutex不是拿来做这个的,难道是拿来做别的事情的??

蓝眼泪 2022-09-25 21:22:40

hMutex是可以保护单CPU下的线程同步,但不能保护多CPU下的线程同步,关键还在于WaitForSingleObject这个函数上,它不能保证在多CPU下的线程同步,要保证多CPU下线程的同步可以使用如CCriticalSection之类的线程同步类,具体使用方法可以参阅msdn.

旧城烟雨 2022-09-25 21:22:40

单核玩线程同步有啥意义?
楼上的哥们的说法大多有问题,线程同步问题的产生,就是应对多核CPU。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文