免费注册 查看新帖 |

Chinaunix

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

[C] int a; 一个线程写a,另一线程读a,如果不加锁,果然出现写了一半,读了一半的情况! [复制链接]

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

int  a; 一个线程写a,另一线程读a,如果不加锁,果然出现写了一半,读了一半的情况!

比如写线程里两条语句
a = 2;
a = 3;

在执行完 a = 2 还没执行 a = 3 完时,读线程去读a,读到的有可能就不是2!!!

例子:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #include <assert.h>

  5. #define      MAXVAL      (~0)
  6. #define      STARTVAL      (MAXVAL-5)

  7. #define      LOCK(mutex)              //pthread_mutex_lock(&(mutex))
  8. #define      UNLOCK(mutex)      //pthread_mutex_unlock(&(mutex));


  9. pthread_mutex_t                mtx;
  10. unsigned int          a = STARTVAL;


  11. static void  treadfun(void)
  12. {
  13.         while(1)
  14.         {
  15.                 LOCK(mtx);
  16.                         if(MAXVAL == a)
  17.                                 a = STARTVAL;
  18.                         else
  19.                                 a++;
  20.                 UNLOCK(mtx);
  21.         }
  22.         return;
  23. }

  24. int main()
  25. {
  26.         int  i;
  27.         pthread_t        tid[10];

  28.         printf("MAXVAL = %u, STARTVAL = %u\n", MAXVAL, STARTVAL);

  29.         pthread_mutex_init(&mtx, NULL);

  30.         for(i=0; i<10; i++)
  31.         {
  32.                 if(0 != pthread_create(&tid[i],NULL,(void *)treadfun,NULL))
  33.                 {
  34.                         fprintf(stderr,"Create thread error!\n");
  35.                         return -1;
  36.                 }
  37.         }

  38.         while(1)
  39.         {
  40.                 printf("a = %u\n", a);
  41.                 LOCK(mtx);
  42.                 assert(STARTVAL <= a && a <= MAXVAL );
  43.                 UNLOCK(mtx);
  44.         }
  45.        
  46.         pthread_mutex_destroy(&mtx);

  47.         printf("test end.\n");

  48.         return 0;
  49. }


复制代码
执行结果:
... ...
a = 4294967291
a = 4294967295
a = 4294967293
a = 4294967292
a = 4294967290
a = 4294967295
a = 4294967293
a = 4294967295
a = 4294967292
main: Assertion `((~0)-5) <= a && a <= (~0)' failed.
Aborted (core dumped)

论坛徽章:
12
寅虎
日期:2013-12-04 20:37:4915-16赛季CBA联赛之广东
日期:2017-08-22 19:23:1215-16赛季CBA联赛之上海
日期:2016-06-18 23:05:05操作系统版块每日发帖之星
日期:2016-06-06 06:20:00操作系统版块每日发帖之星
日期:2016-06-05 06:20:00操作系统版块每日发帖之星
日期:2016-06-03 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之巴勒斯坦
日期:2015-02-10 21:38:08卯兔
日期:2014-10-31 20:42:23申猴
日期:2014-06-11 17:15:10处女座
日期:2014-05-22 09:00:1815-16赛季CBA联赛之广夏
日期:2017-09-25 23:37:46
2 [报告]
发表于 2013-04-17 12:18 |只看该作者

你要是读出来的既不是2,也不是3,那才有点儿意思。

论坛徽章:
0
3 [报告]
发表于 2013-04-17 12:29 |只看该作者
wait_rabbit 发表于 2013-04-17 12:18
你要是读出来的既不是2,也不是3,那才有点儿意思。

就是既不是2也不是3,所以assert(2==a || 3 == a)时程序退出

论坛徽章:
12
寅虎
日期:2013-12-04 20:37:4915-16赛季CBA联赛之广东
日期:2017-08-22 19:23:1215-16赛季CBA联赛之上海
日期:2016-06-18 23:05:05操作系统版块每日发帖之星
日期:2016-06-06 06:20:00操作系统版块每日发帖之星
日期:2016-06-05 06:20:00操作系统版块每日发帖之星
日期:2016-06-03 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之巴勒斯坦
日期:2015-02-10 21:38:08卯兔
日期:2014-10-31 20:42:23申猴
日期:2014-06-11 17:15:10处女座
日期:2014-05-22 09:00:1815-16赛季CBA联赛之广夏
日期:2017-09-25 23:37:46
4 [报告]
发表于 2013-04-17 12:56 |只看该作者
本帖最后由 wait_rabbit 于 2013-04-17 12:57 编辑

回复 3# iw1210

上代码。 以及执行的打印消息,把a打出来看看。

   

论坛徽章:
1
午马
日期:2013-08-23 23:39:47
5 [报告]
发表于 2013-04-17 13:08 |只看该作者
gcc -S



论坛徽章:
9
CU大牛徽章
日期:2013-04-17 11:06:23CU大牛徽章
日期:2013-04-17 11:08:52CU大牛徽章
日期:2013-04-17 11:09:10CU大牛徽章
日期:2013-04-17 11:09:40CU大牛徽章
日期:2013-04-17 11:09:57CU大牛徽章
日期:2013-04-17 11:10:17CU大牛徽章
日期:2013-05-20 10:43:41CU大牛徽章
日期:2013-05-20 10:44:06CU大牛徽章
日期:2013-05-20 10:44:16
6 [报告]
发表于 2013-04-17 13:44 |只看该作者
顶一下,顺便查看一下徽章

论坛徽章:
0
7 [报告]
发表于 2013-04-17 13:54 |只看该作者
同步一下 不就得了

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
8 [报告]
发表于 2013-04-17 14:17 |只看该作者
不加锁你问个毛啊。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
9 [报告]
发表于 2013-04-17 14:31 |只看该作者
it is impossilbe.
even you don't take an interlock here, what you said is impossible to happen.
i am sure you take a mistake that how to r/w a file.
(checked that the reading is successful or not?)

论坛徽章:
0
10 [报告]
发表于 2013-04-17 14:40 |只看该作者
双线程持有一个对象(值)的时候不同步肯定会出现这个状况,因为你并不能知道两个线程执行的先后顺序以及执行到什么程度就会切换线程
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP