免费注册 查看新帖 |

Chinaunix

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

pthread线程互斥量的问题(已解决,谢谢) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-05 13:13 |只看该作者 |倒序浏览
本帖最后由 izualzhy 于 2011-11-05 18:03 编辑

pthread编程时遇到的问题,代码在下面
当NLOOP值比较小时没有问题,mutex起作用了。
当NLOOP逐渐增大,我多次运行编译后的程序,会遇到结果不正常的情况。
不知道在各位机器上运行怎么样?
有人能给分析下么?
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <pthread.h>

  5. #define NLOOP 2000

  6. int counter; /*incremented by threads*/
  7. pthread_mutex_t counter_mutex = PTHREAD_MUTEX_INITIALIZER;

  8. void *doit(void *vptr)
  9. {
  10.         int i,var;
  11.         for ( i=0; i<NLOOP; ++i) {
  12.                 pthread_mutex_lock(&counter_mutex);
  13.                 /*printf("%x: %d\n",(unsigned int)pthread_self(),counter);*/
  14.                 counter++;
  15.                 pthread_mutex_unlock(&counter_mutex);
  16.                 /*usleep(1000);*/
  17.         }

  18.         return NULL;
  19. }

  20. int main(int argc, char *argv[])
  21. {
  22.         pthread_t tidA,tidB;
  23.         pthread_create(&tidA, NULL, &doit, NULL);
  24.         pthread_create(&tidB, NULL, &doit, NULL);

  25.         /*wait for both threads to terminate*/
  26.         pthread_join(tidA,NULL);
  27.         pthread_join(tidA,NULL);

  28.         printf("counter = %d\n",counter);
  29.         /*sleep(1);*/
  30.         /*printf("counter = %d\n",counter);*/
  31.         /*if (write(STDOUT_FILENO,&counter,sizeof(counter)) != sizeof(counter))*/
  32.                 /*printf("write error\n");*/

  33.         return 0;
  34. }
复制代码

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2011-11-05 14:25 |只看该作者
pthread_join(tidA,NULL);
        pthread_join(tidA,NULL);
怎么重复了

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
3 [报告]
发表于 2011-11-05 14:29 |只看该作者
counter_mutex 是不是得用什么函数初始化一下?

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
4 [报告]
发表于 2011-11-05 14:30 |只看该作者
另外对于全局变量 int counter; 我google了一下
http://webservices.ctocio.com.cn/net/405/9158905.shtml

论坛徽章:
0
5 [报告]
发表于 2011-11-05 16:29 |只看该作者
线程间的全局变量要声明为volatile的 。
具体原因可以自己google下

论坛徽章:
0
6 [报告]
发表于 2011-11-05 17:59 |只看该作者
回复 2# bruceteen


    改了,好像就是这里的问题。。。2了。。。。
谢谢。

论坛徽章:
0
7 [报告]
发表于 2011-11-05 18:03 |只看该作者
回复 5# davelv


    谢谢
虽然根源不是这里,而是代码里我写错了。不过volatile加上好像也有一定的道理。

论坛徽章:
0
8 [报告]
发表于 2011-11-07 15:51 |只看该作者
回复 5# davelv
剖析为什么在多核多线程程序中要慎用volatile关键字?http://note.sdo.com/u/1454652138/n/mJ3HG~jqfgqFnM00M0031H

论坛徽章:
0
9 [报告]
发表于 2011-11-07 16:16 |只看该作者
回复 8# digdeep126


    这个剖析是给我看得吗? 要我看什么部分呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP