免费注册 查看新帖 |

Chinaunix

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

在信号处理函数里边调用pthread_mutex_lock()是否安全? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-25 09:53 |只看该作者 |倒序浏览
本帖最后由 ChiyuT 于 2011-08-25 11:23 编辑

如下所示:

线程(thread)和信号处理函数(sig_chld)都拥有同一把全局的锁,当thread在执行代码段 A 的时候,如果来了信号(SIGCHLD),导致线程中断,转而执行sig_chld,并试图获取锁。由于thread并没有释放该锁,这个时候是不是会发生死锁?


不知道大家是怎么处理这个问题的?有什么好的替代方案吗?

谢谢!!
  1. thread:

  2. {
  3.         pthread_mutex_lock();

  4.         A;       

  5.         pthread_mutex_unlock();

  6. }


  7. sig_chld:

  8. {

  9.         pthread_mutex_lock();
  10.        
  11.         A;

  12.         pthread_mutex_unlock();

  13. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-08-25 10:07 |只看该作者
本帖最后由 雨过白鹭洲 于 2011-08-25 10:09 编辑
The mutex functions are not async-signal safe. What this means is that they should not be called from a signal handler


from pthread mutex manual page

论坛徽章:
0
3 [报告]
发表于 2011-08-25 10:21 |只看该作者
内容

多谢!如果某信号来时,必须要处理某一些公共数据的时候该怎马办呢?大家在这种情况下都是如何设计的方案?

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
4 [报告]
发表于 2011-08-25 10:43 |只看该作者
内容

多谢!如果某信号来时,必须要处理某一些公共数据的时候该怎马办呢?大家在这种情况下都是如何设计 ...
ChiyuT 发表于 2011-08-25 10:21


信号来时看在哪个线程上下文下执行, 如果就是在和潜在冲突的线程上下文下, 直接处理即可, 不用担心;
如果和发生冲突的线程不是一个, 完全可以使用锁。

我觉得是哈, 从原理分析的, 但不保证正确。  
不过话说回来, 如果信号处理函数处理过程中 禁止了其他线程抢占, 那么所有情况下都可以不用锁了, 所以应该正确的可能性很大的

论坛徽章:
0
5 [报告]
发表于 2011-08-25 11:19 |只看该作者
回复 4# zylthinking


谢谢!

仔细考虑了一下,为了绝对安全起见, 打算新开一个线程无限循环调用waitpid,专门干信号处理函数的活儿。

不知道这样做是否有隐患?

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
6 [报告]
发表于 2011-08-25 11:50 |只看该作者
似乎是严密的, 暂时想不出不安全来

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
7 [报告]
发表于 2011-08-25 20:19 |只看该作者
在上锁前禁止信号处理.

论坛徽章:
0
8 [报告]
发表于 2011-08-25 21:22 |只看该作者
本帖最后由 ChiyuT 于 2011-08-25 21:27 编辑
在上锁前禁止信号处理.
smalloc 发表于 2011-08-25 20:19



在线程里屏蔽掉?是下边这样吗?貌似这样不能阻止信号处理函数的打断吧?

还请明示。
  1. thread:

  2. thread_sigmask()    /*  屏蔽 signo  */

  3. pthread_lock();

  4. A....

  5. pthread_unlock();

  6. thread_sigmask();     /*  恢复 signo   */

复制代码

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
9 [报告]
发表于 2011-08-25 21:29 |只看该作者
本帖最后由 smalloc 于 2011-08-25 21:34 编辑

回复 8# ChiyuT


    2个信号间相互打断确实处理不了.  posix多线程程序设计 中建议的是只在主线程中处理信号

论坛徽章:
0
10 [报告]
发表于 2011-08-25 21:57 |只看该作者
回复 9# smalloc

现在比较郁闷的是,我决定新开一个线程来专门调用waitpid(),对子进程进行收割。可问题是,该线程生成的时候,很有可能主线程还并没有创建子进程。因此会导致waitpid直接返回。

我在想有没有一个比较好的办法解决这个问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP