免费注册 查看新帖 |

Chinaunix

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

求助:是否安全的volatile变量? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-03 17:44 |只看该作者 |倒序浏览
volatile int count;

如果A线程只是访问该变量,

B线程会修改变量;

有问题吗?我感觉没问题。

望大家指导,谢谢。

论坛徽章:
0
2 [报告]
发表于 2010-08-03 18:19 |只看该作者
SB的linux,shit

没问题啊,你不放心就加锁。

论坛徽章:
0
3 [报告]
发表于 2010-08-03 18:41 |只看该作者
本帖最后由 okocha-jay 于 2010-08-03 18:48 编辑

谢谢。做了个测试代码。暂时没问题
有错误,还需再改。
  1. #include <stdio.h>
  2. #include <pthread.h>

  3. #define N 100000

  4. int a[N] = {0};
  5. volatile int r = 0; // index to a
  6. volatile int w = 0; // index to a

  7. #define NotFull (w <= N - 1)

  8. #define NotEmpty (r < w)
  9. // w 是由生产者修改, 消费者要访问的
  10. void * Pthread(void *arg) // 生产者
  11. {
  12.         printf("producer %u\n", pthread_self());
  13.         while ( NotFull )
  14.         {
  15.                 usleep(1);
  16.                 a[w] = w; // 模仿Stevens的进程间通信书中例子
  17.                 ++w;
  18.         }
  19.         return 0;
  20. }

  21. void * Cthread(void *arg) // 消费者
  22. {
  23.         printf("consumer %u\n", pthread_self());
  24.         while ( NotEmpty || NotFull )
  25.         {
  26.                                 usleep(1);
  27.                 if ( !NotEmpty)//消费的太快了
  28.                          continue;
  29.                                     
  30.                                 if ( r != a[r] )

  31.                         printf("ERROR : a[%d] = %d\n", r, a[r]);
  32.                                 ++ r;
  33.         }
  34. }
  35. int main()
  36. {
  37.         pthread_t prod, con;

  38.         pthread_create(&prod, NULL, Pthread, NULL);
  39.         pthread_create(&con, NULL, Cthread, NULL);

  40.         pthread_join(prod, NULL) ;
  41.         pthread_join(con, NULL) ;
  42.        
  43.         return 0;
  44. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2010-08-03 18:46 |只看该作者
volatile 变量阿,如果你对访问变量的正确性不是很高要求的话,这样做应该没问题。

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
5 [报告]
发表于 2010-08-03 19:18 |只看该作者
volatile 跟多线程没有任何关系

论坛徽章:
0
6 [报告]
发表于 2010-08-03 20:49 |只看该作者
本帖最后由 lyyunfei 于 2010-08-03 20:53 编辑

我觉得关键看你的系统的架构,还有编译器。这种情况是有出错的可能的
typedef struct{
                         char a[3];
                         volatile    int    b;
                      } __attribute__((package));
b 不对齐,两个读操作,可以实验一下。两个读操作中间可能就线程切换了
我在猜想,linux的线程不是轻量级进程,会不会linux在调度器上有这样得优化,就是单核就让一个进程空间内的两个线程依次被调度,这样地址空间就不用做切换,cache,tlb都能保留。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP