免费注册 查看新帖 |

Chinaunix

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

[进程管理] 请教大牛个问题:多线程若线程2正锁住mutex,此时线程1使用pthread_mutex_try()作用? [复制链接]

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

请教大牛一个问题:
共享全局变量

static int g_int=0;
static pthread_mutex_t mutex;

线程1:
  1.     int ret = pthread_mutex_trylock(&mutex);                        //try lock
  2.     [size=5][color=Magenta]如何设置等待mutex时间?[/color][/size]

  3.     if (ret == EBUSY){
  4.                                     printf("pthread2:the variable is locked by pthread1\n");
  5.     被其他线程使用时,缓存动作

  6.     } else if (ret != 0) {
  7.                                     perror("pthread_mutex_trylock");
  8.                                     exit(1);
  9.     } else {
  10.                                     printf("pthread2:pthread2 got lock.\n");
  11.     马上设g_int=1;
  12.                                     pthread_mutex_unlock(&mutex);
  13.     }
复制代码
复制代码
线程2:
  1.     pthread_mutex_lock(&mutex);
  2.     //do something
  3.     //处理时间比较长
  4.     g_int=1;
  5.     pthread_mutex_unlock(&mutex)
复制代码
复制代码
若线程2正锁住mutex时,此时线程1使用pthread_mutex_trylock()会立即返回吗?
可以让thread_a设置等待mutex锁的时间吗?pthread_cond_timedwait等有设计过的吗?

论坛徽章:
0
2 [报告]
发表于 2013-03-28 10:41 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2013-03-28 15:04 |只看该作者
本帖最后由 blake326 于 2013-03-28 15:06 编辑

pthread_mutex_lock()系列好像没有超时等待的吧。不记得了。

线程1要超时的话,一般是pthread_mutex_lock阻塞住,然后搞一个定时器吧。次奥,不记得了什么api了,不过倒是用过alarm信号的,一点也不好用。

论坛徽章:
0
4 [报告]
发表于 2013-03-28 15:17 |只看该作者
本帖最后由 blake326 于 2013-03-28 15:25 编辑

好像linux 用户态真没有什么现成的timer api呢。怪不得我以前用了alarm。

可以借鉴内核设计,在用户态创建一个timer线程专门提供timer功能。

timer线程主要维护一个红黑树,管理所有timer,key的话是超时的绝对秒数。然后一个死循环,通过select睡眠一个最近的超时时间。当select超时返回时,检测红黑树上所有超时的timer,进行回调处理。如果注册了一个timer要比当前最近的timer更早的超时的话,则要让发一个信号让select立即返回,检查是否要处理超时时间,并且更新最新的睡眠时间。

提供timer api貌似也得有一个线程。

论坛徽章:
0
5 [报告]
发表于 2013-04-18 12:14 |只看该作者
回复 4# blake326


   

论坛徽章:
0
6 [报告]
发表于 2013-04-19 22:04 |只看该作者
回复 4# blake326
内核在用户态提供了POSIX TIMER API:
基于 2.6 版本内核定时器的实现 (Posix 实时定时器 )
Linux 自 2.6 开始,已经开始支持 POSIX timer [ 2 ]所定义的定时器,它主要由下面的接口构成 :

清单 8. POSIX timer 接口
                               
#include <signal.h>
#include <time.h>

int timer_create(clockid_t clockid, struct sigevent *evp,
timer_t *timerid);
int timer_settime(timer_t timerid, int flags,
const struct itimerspec *new_value,
struct itimerspec * old_value);
int timer_gettime(timer_t timerid, struct itimerspec *curr_value);
int timer_getoverrun(timer_t timerid);
int timer_delete(timer_t timerid);

这套接口是为了让操作系统对实时有更好的支持,在链接时需要指定 -lrt 。
timer_create(2): 创建了一个定时器。
timer_settime(2): 启动或者停止一个定时器。
timer_gettime(2): 返回到下一次到期的剩余时间值和定时器定义的时间间隔。出现该接口的原因是,如果用户定义了一个 1ms 的定时器,可能当时系统负荷很重,导致该定时器实际山 10ms 后才超时,这种情况下,overrun=9ms 。
timer_getoverrun(2): 返回上次定时器到期时超限值。
timer_delete(2): 停止并删除一个定时器

详见https://www.ibm.com/developerworks/cn/linux/l-cn-timers/


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP