免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
11 [报告]
发表于 2011-08-26 09:13 |只看该作者
测试了 一下你说的情况
环境  fedora  14  
代码
  1. using namespace std;

  2. pthread_mutex_t mmutex=PTHREAD_MUTEX_INITIALIZER;

  3. void* handler1(void* vp)
  4. {
  5.      pthread_mutex_lock(&mmutex);
  6.      int i;
  7.      for(i=0;i<100;i++){
  8.          sleep(1);
  9.          cout<<"this is thread A....."<<endl;
  10.         }
  11.      pthread_mutex_unlock(&mmutex);
  12. }
  13. void sig_handler(int signo)
  14. {
  15.     pthread_mutex_lock(&mmutex);
  16.     int i;
  17.     for(int i=0;i<100;i++){
  18.         sleep(1);
  19.         cout<<"this is handler A......."<<endl;
  20.     }
  21.     pthread_mutex_unlock(&mmutex);
  22.     signal(15,sig_handler);
  23. }
  24. main()
  25. {

  26.     signal(15,sig_handler);
  27.     pthread_t p;
  28.     pthread_create(&p,NULL,handler1,NULL);
  29.     pthread_join(p,NULL);
  30.     pthread_mutex_destroy(&mmutex);
  31. }
复制代码
先运行 这个 程序  然后另外开一个窗口  执行 ps aux | grep XXX
得到相关的进程号
kill -15  进程号   
我的结果是:
先执行 完线程函数   handler1
再执行  信号函数     sig_handler

如果 把锁去掉   两个函数一起执行  输出信息交替打印。

以上说明  如果线程在跑,这个时候来了一个信号,相当于主程序多了一段可执行代码。
属于正常竞争  ,不会出现楼主说的中断,等等。属于正常竞争。

论坛徽章:
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
12 [报告]
发表于 2011-08-26 11:13 |只看该作者
测试了 一下你说的情况
环境  fedora  14  
代码先运行 这个 程序  然后另外开一个窗口  执行 ps aux |  ...
longmm1988 发表于 2011-08-26 09:13


这个测试不靠普, 事实上信号捕捉函数可以在任意线程上下文下执行

论坛徽章:
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
13 [报告]
发表于 2011-08-26 11:14 |只看该作者
回复  smalloc

现在比较郁闷的是,我决定新开一个线程来专门调用waitpid(),对子进程进行收割。可问题是 ...
ChiyuT 发表于 2011-08-25 21:57


这个是你的业务逻辑该解决的问题, 和机制没关系

论坛徽章:
0
14 [报告]
发表于 2011-08-26 12:15 |只看该作者
回复 12# zylthinking

什么意思 不明白 ? ????
我的意思是说 两个函数之间是 正常竞争

论坛徽章:
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
15 [报告]
发表于 2011-08-26 12:19 |只看该作者
我的意思是说, 信号处理函数不保证再主线程运行, 而又可能再你例子里面的 handler1 中任意时刻运行, 那么 现在你看:
sig_handler 要进入临界区, 但进不去; handler 要释放临界区需要得到运行权, 而现在它自己就在执行 sig_handler; 如果是递归锁, 还没有问题, 如果是非递归锁呢?

论坛徽章:
0
16 [报告]
发表于 2011-08-26 15:11 |只看该作者
回复 15# zylthinking


    在我的代码中 主线程中有这样一句,pthread_join(),也就是说主线程一定会被阻塞,
    也就是说,信号一定是在子线程跑的时候被触发的(sleep()的时候线程不会把锁交出)
    上面我可能说错了 ,sig_handler 有自己的栈  我感觉 它应该是区别于主线程,和子线程的另外一个线程
    我感觉。。。。。
    我自己在验证一下。。。

论坛徽章:
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
17 [报告]
发表于 2011-08-26 15:13 |只看该作者
本帖最后由 zylthinking 于 2011-08-26 15:14 编辑
回复  zylthinking


    在我的代码中 主线程中有这样一句,pthread_join(),也就是说主线程一定会被阻 ...
longmm1988 发表于 2011-08-26 15:11


它是一个中断, 可以在本进程中任意线程上下文中运行;说起来内容太多了, 一个帖子不太好解释清楚, 去看一下signal的实现原理吧

论坛徽章:
0
18 [报告]
发表于 2011-08-26 15:15 |只看该作者
回复 15# zylthinking


    晕 我的想法有问题。。。晕

论坛徽章:
0
19 [报告]
发表于 2011-08-26 22:24 |只看该作者
这个是你的业务逻辑该解决的问题, 和机制没关系
zylthinking 发表于 2011-08-26 11:14


加了一个信号量搞定了。

论坛徽章:
0
20 [报告]
发表于 2011-08-27 02:56 |只看该作者
pthread_mutex_lock();和pthread_mutex_unlock();不是可重入函数,不要在信号处理函数中调用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP