免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Moon_Bird
打印 上一主题 下一主题

[C] 面试题:一个进程读,一个进程写,怎么实现无锁访问共享内存呢 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2012-10-03 20:58 |显示全部楼层
本帖最后由 一刀。 于 2012-10-03 21:33 编辑

用sched_yield()、信号、共享内存模拟线程的条件变量。
或者用共享内存模拟自旋锁。


补充一下:sched_yield()的方法只能用于单CPU环境,不需要使用信号。自旋锁的方法用google搜索Peterson方案。

论坛徽章:
0
2 [报告]
发表于 2012-10-04 00:05 |显示全部楼层
本帖最后由 一刀。 于 2012-10-04 00:17 编辑

回复 20# 群雄逐鹿中原


    在WIKI上看到一个用yield()实现的生产者/消费者模型。感觉很不错,所以单独提出来说,本质确实如你所说的的忙等待。
  1. volatile unsigned int produceCount, consumeCount;
  2. TokenType buffer[BUFFER_SIZE];

  3. void producer(void) {
  4.     while (1) {
  5.         while (produceCount - consumeCount == BUFFER_SIZE)
  6.             sched_yield(); // buffer is full

  7.         buffer[produceCount % BUFFER_SIZE] = produceToken();
  8.         produceCount += 1;
  9.     }
  10. }

  11. void consumer(void) {
  12.     while (1) {
  13.         while (produceCount - consumeCount == 0)
  14.            sched_yield(); // buffer is empty

  15.         consumeToken( buffer[consumeCount % BUFFER_SIZE]);
  16.         consumeCount += 1;
  17.     }
  18. }
复制代码
补充:
用条件变量实现的生产者好像也可以理解为忙等
  1. int queue_size  = 100;
  2. int fill_count  = 0;

  3. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  4. pthread_cond_t  fill  = PTHREAD_COND_INITIALIZER;
  5. pthread_cond_t  empty = PTHREAD_COND_INITIALIZER;

  6. void enqueue()
  7. {
  8.         pthread_mutex_lock(&mutex);
  9.         while(fill_count == queue_size)
  10.                 pthread_cond_wait(&empty, &mutex);

  11.         /* enqueue */
  12.         fill_count++;

  13.         pthread_cond_broadcast(&fill);
  14.         pthread_mutex_unlock(&mutex);
  15. }

  16. void dequeue()
  17. {
  18.         pthread_mutex_lock(&mutex);
  19.         while(fill_count == 0)
  20.                 pthread_cond_wait(&fill, &mutex);

  21.         /* dequeue */
  22.         fill_count--;

  23.         pthread_cond_broadcast(&empty)
  24.         pthread_cond_unlock(&mutex);
  25. }

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP