免费注册 查看新帖 |

Chinaunix

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

[C] 关于posix线程的几个问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-10-30 11:00 |只看该作者
4个锁中既然有没释放的,那说明还有线程在使用共享数据,E当然就不能用了,如果都是读的话,使用读写锁

论坛徽章:
0
12 [报告]
发表于 2008-10-30 11:10 |只看该作者
原帖由 cugb_cat 于 2008-10-30 11:00 发表
4个锁中既然有没释放的,那说明还有线程在使用共享数据,E当然就不能用了,如果都是读的话,使用读写锁

是这样的,E是与时间相关的数据处理,E线程在周期性的时间到时,要求A、B、C、D停止写,如何通知A、B、C、D没释放的锁解锁?

论坛徽章:
0
13 [报告]
发表于 2008-10-30 11:16 |只看该作者
原帖由 什么名 于 2008-10-30 11:10 发表

是这样的,E是与时间相关的数据处理,E线程在周期性的时间到时,要求A、B、C、D停止写,如何通知A、B、C、D没释放的锁解锁?

那就在ABCD中各设置一个变量,这4个线程循环写的时候,一边写一边检查该变量的值,当E要处理数据时,先try lock一下,如果有线程没解锁,就修改相应变量的值,相应的线程检查到变量的值变了,就去解锁。

论坛徽章:
0
14 [报告]
发表于 2008-10-30 11:39 |只看该作者
原帖由 cugb_cat 于 2008-10-30 11:16 发表

那就在ABCD中各设置一个变量,这4个线程循环写的时候,一边写一边检查该变量的值,当E要处理数据时,先try lock一下,如果有线程没解锁,就修改相应变量的值,相应的线程检查到变量的值变了,就去解锁。

明白你的意思了,按照如下方式是吗?

  1. 约定 flagA = 1 E线程操作数据, flagA = 0 , A,B,C,D 操作数据


  2. A:

  3. pthread_mutex_lock(&lockerA);


  4.     while((flagA==0)&&(数据未写完)) {
  5.         写数据;
  6.     }

  7.     if (flagA==1) {
  8.         pthread_mutex_unlock(&lockerA);  //  解锁语句1,采用goto UNLOCK吗?
  9.     }

  10.    ……
  11. UNLOCK:
  12. pthread_mutex_unlock(&lockerA);  //  解锁语句2



  13. E:

  14. if (pthread_mutex_trylock(&lockerA) == EBUSY ) {

  15.         flagA = 1;                 // tell A to unlock
  16.         pthread_mutex_lock(&lockerA);
  17.        
  18.         写数据 a, b, c, d;
  19.        
  20.         pthread_mutex_unlock(&lockerA)

  21. } else { // get the locker
  22.        
  23.         写数据 a, b, c, d;       
  24.         pthread_mutex_unlock(&lockerA)
  25. }
复制代码


有个问题,线程A等在发现flag=1时解锁后下一次获得时间片时,不会继续从if之后的语句执行 解锁语句2了吧?否则会解锁两次。

[ 本帖最后由 什么名 于 2008-10-30 11:47 编辑 ]

论坛徽章:
0
15 [报告]
发表于 2008-10-30 12:06 |只看该作者
原帖由 什么名 于 2008-10-30 11:39 发表

明白你的意思了,按照如下方式是吗?

约定 flagA = 1 E线程操作数据, flagA = 0 , A,B,C,D 操作数据


A:

pthread_mutex_lock(&lockerA);


    while((flagA==0)&&(数据未写完)) {
        写数据; ...

改了一下,在flag=1时,A不可写,此时应该让其阻塞,结合条件变量调用pthread_cond_wait,这样会自动解锁,而等条件成立时候又会自动加锁,从而继续A线程,
不会引起由goto跳转早餐部分代码流程被忽略,也不会有多次被解锁的问题,不知道是否正确呢?
但仍然发现几个问题“

  1. //约定 flagA = 1 E线程操作数据, flagA = 0 , A,B,C,D 操作数据


  2. //A:

  3. pthread_mutex_lock(&lockerA);

  4.     while((flagA==0) && (数据未写完)) { // 问题1: 影响性能,同时如果写数据是多个语句,而且耗时很长,照样不能及时解锁
  5.         写数据;
  6.     }

  7.     if (flagA==1) {
  8.         //pthread_mutex_unlock(&lockerA);
  9.         pthread_cond_wait(&cond, &locker); // 阻塞
  10.         //  // 问题2: 前面wihle中未写完成的数据怎么办?
  11.     }

  12.     ……

  13. pthread_mutex_unlock(&lockerA);



  14. //E:

  15. if (pthread_mutex_trylock(&lockerA) == EBUSY ) {

  16.         flagA = 1;                 // tell A to unlock
  17.         pthread_cond_signal();  //notify A to unlock

  18.         pthread_mutex_lock(&lockerA);

  19.         写数据 a, b, c, d;
  20.        
  21.         pthread_mutex_unlock(&lockerA);


  22. } else { // get the locker
  23.        
  24.         写数据 a, b, c, d;       
  25.         pthread_mutex_unlock(&lockerA);
  26. }
复制代码

[ 本帖最后由 什么名 于 2008-10-30 13:06 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP