免费注册 查看新帖 |

Chinaunix

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

关于互斥量的问题 pthread_mutex_trylock函数 [复制链接]

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


pthread_mutex_lock(&t);

while(pthread_mutex_trylock(&t));
有什么本质的却别……让有的代码选用第二种……而不是第一种

第一种阻塞 第二种不阻塞 不断尝试……

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
2 [报告]
发表于 2012-03-17 17:38 |只看该作者
本质区别不就在“try”吗

选哪个取决于场景:
当前线程锁失败,也可以继续其它任务,用trylock合适
当前线程只有锁成功后,才会做一些有意义的工作,那就_lock,没必要轮询trylock

论坛徽章:
0
3 [报告]
发表于 2012-03-17 19:50 |只看该作者
额……我也知道 如果用while(pthread_mutex_trylock(&t));这种代码 为什么不直接用pthread_mutex_lock(&t);让他阻塞呢???但是……我真的碰到了这样的代码……memcached里的代码……memcached.h中……找一下内联函数mutex_lock的定义……

论坛徽章:
0
4 [报告]
发表于 2012-03-17 19:52 |只看该作者
求大神解释一下……而且 里面的加锁有用pthread_mutex_lock的……也有用自己定义的这个mutex_lock的……奇怪阿……

论坛徽章:
0
5 [报告]
发表于 2012-03-17 20:00 |只看该作者
哎……好久没来chinaunix了阿……哇哈哈哈哈 这里还是意外的亲切阿……

论坛徽章:
3
数据库技术版块每日发帖之星
日期:2015-06-18 22:20:00数据库技术版块每日发帖之星
日期:2015-06-21 22:20:00数据库技术版块每日发帖之星
日期:2015-08-27 06:20:00
6 [报告]
发表于 2012-03-17 22:31 |只看该作者
pthread_muext_trylock(&t)让你在没有获得锁的时候,还有机会退出,而pthread_mutex_lock(&t)会一直等下去。

假设你写了一个程序,当按下Ctrl+c后,你希望程序捕获到Ctrl+c后可以退出,但如果你的程序阻塞在了pthread_mutet_lock,那么程序就再也退不出来了,这时你可以这样写程序:
signal(SIGHUP, signal_func);
signal(SIGQUIT, signal_func);
...
...
while(pthread_mutex_trylock(&t) && (!g_bExit))
{
    usleep(1000);
}

void signal_func(int no)
{
    switch (no)
    {
    case SIGINT:
        g_bExit = 1;
        break;
    case SIGTERM:
        g_bExit = 1;
        break;

    default:
        break;
    break;
    }
}

按下Ctrl+C后,把全局变量g_bExit设置为1了,然后程序在while循环中检查到g_bExit为真后,就可以退出while循环了。

论坛徽章:
0
7 [报告]
发表于 2012-03-18 10:07 |只看该作者
osdba 发表于 2012-03-17 22:31
pthread_muext_trylock(&t)让你在没有获得锁的时候,还有机会退出,而pthread_mutex_lock(&t)会一直等下去。 ...


说实话 您的解释我能理解 应该也使那样的 我很同意 可惜
如下代码  ctrl+c 程序可以正常退出 并没有未响应 在freebsd8.2 ubuntu下试验过

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
pthread_mutex_t t;
void func(int arg)
{
    printf("Get SIGINT\n");
    exit(0);
}
void *thr_fn(void *args)
{
    printf("B\n");
    pthread_mutex_lock(&t);
    return (void*)0;
}
int main()
{
    pthread_t pt;
    pthread_mutex_init(&t,NULL);
    signal(SIGINT,&func);
    pthread_create(&pt,NULL,thr_fn,NULL);
    usleep(1000);
    pthread_mutex_lock(&t);
    printf("A\n");
    pthread_mutex_unlock(&t);
    return 0;   
}

论坛徽章:
3
数据库技术版块每日发帖之星
日期:2015-06-18 22:20:00数据库技术版块每日发帖之星
日期:2015-06-21 22:20:00数据库技术版块每日发帖之星
日期:2015-08-27 06:20:00
8 [报告]
发表于 2012-03-18 19:34 |只看该作者
直接exit(0),Ctrl+C是可以直接退出,如果你需要后续的清理工作,就最好写成我给的那个例子那样,这样主线程有机会得到后续的执行,可以执行一些清理工作。

论坛徽章:
0
9 [报告]
发表于 2012-04-06 16:03 |只看该作者
应该是一样的。man可以看出,信号并不对函数造成影响:
If a signal is delivered to a thread waiting for a mutex, upon return from the  signal  handler  the thread shall resume waiting for the mutex as if it was not interrupted.

不知道以前信号对这2个函数是否会造成影响,如果信号会导致等待锁的函数返回。那么pthread_mutex_lock(&t); 就没有 while(pthread_mutex_trylock(&t));好了。

论坛徽章:
0
10 [报告]
发表于 2012-05-03 21:05 |只看该作者
回复 3# vulturecc

我也困惑此问题,感觉两者是一样的,真没什么区别吧?

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP