免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4502 | 回复: 13
打印 上一主题 下一主题

求助 线程同步中 关于双核的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-26 11:25 |只看该作者 |倒序浏览
编了一段关于线程同步的代码,在单核的机器上用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 编辑 ]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2008-04-26 12:00 |只看该作者
把你的测试和测试结果发出来,只是这样说没有证据。

论坛徽章:
0
3 [报告]
发表于 2008-04-26 12:58 |只看该作者
代码贴上了,大家帮忙看看吧

论坛徽章:
0
4 [报告]
发表于 2008-04-26 13:25 |只看该作者
改天找个双核的机器试试看呵呵

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
5 [报告]
发表于 2008-04-26 13:42 |只看该作者
testcase应该写的更能说明问题
比方
printf("run1:%d\n",counter);

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

论坛徽章:
0
6 [报告]
发表于 2008-04-26 18:19 |只看该作者
原帖由 zrl1986 于 2008-4-26 11:25 发表
编了一段关于线程同步的代码,在单核的机器上用mutex可以相互锁住,但是在双核的机器上还是会互相干扰。

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

#include
#include
# ...


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

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

论坛徽章:
0
7 [报告]
发表于 2008-05-14 21:36 |只看该作者
支持楼上的,两个线程同时等待一个mutex,并都对这个mutex进行修改。这样做是很危险的,会导致不可预测的错误发生。
这个代码在单核的机器上也无法保证正确运行。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
8 [报告]
发表于 2008-05-15 12:24 |只看该作者
while(accnt1 + accnt2 == 0)并非一条指令
.......都并非一条指令
另外,
回复 #7 lingyer 的帖子
mutex不是拿来做这个的,难道是拿来做别的事情的??

论坛徽章:
0
9 [报告]
发表于 2008-08-23 13:54 |只看该作者
hMutex是可以保护单CPU下的线程同步,但不能保护多CPU下的线程同步,关键还在于WaitForSingleObject这个函数上,它不能保证在多CPU下的线程同步,要保证多CPU下线程的同步可以使用如CCriticalSection之类的线程同步类,具体使用方法可以参阅msdn.

论坛徽章:
0
10 [报告]
发表于 2008-08-26 10:11 |只看该作者
单核玩线程同步有啥意义?
楼上的哥们的说法大多有问题,线程同步问题的产生,就是应对多核CPU。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP