Linux信号与锁,同时使用会死锁

4 篇文章 0 订阅


     今天接手了一个工程模块,它使用信号做为系统的时钟基准,在回调函数里还用了锁,不晓得这种设计是否合理。

     我的疑问:信号SIGALRM的回调函数里是否需要加锁,它和主线程究竟是什么关系?

     结论:信号回调函数和主线程竟然是同一个线程pid,但是却以类似中断的方式执行,时间到了会在主线程的任意位置中断,如果加了锁,在信号回调函数和主线程里都加解锁,就有一定概率死锁。

    

     另外,高手们帮忙建议一下,应该用什么架构。我们的应用是一个后台模块,既要作为客户端给服务器发数据(TCP,发送速率500Kbps-2Mbps,精度+-5%,多通道(数据不同),有多个定时发送子数据块的任务(未来还会变)),同时也要接受管理模块的通道和状态管理(UDP,添加、删除通道,查询实时速率等)。


    测试代码如下:(测试环境CentOS6.5_x64,系统gcc和库)

#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/syscall.h>

#define gettid() syscall(SYS_gettid) // 线程 ID

using namespace std;

pthread_mutex_t g_mutexChannelInfo;

void sigalrm_fn(int sig) {
 printf("sigalrm_fn! begin lock \n", gettid());
 pthread_mutex_lock(&g_mutexChannelInfo);
 printf("sigalrm_fn! locked \n", gettid());
 printf("alarm!  %5u \n", gettid());
 alarm(2);
 printf("sigalrm_fn! begin unlock \n", gettid());
 pthread_mutex_unlock(&g_mutexChannelInfo);
 printf("sigalrm_fn! unlocked \n", gettid());
 return;
}

int main() {
 pthread_mutex_init(&g_mutexChannelInfo, NULL);
 printf("main!  %5u \n", gettid());
 signal(SIGALRM, sigalrm_fn);
 alarm(1);

 int i = 0;
 printf("main! begin lock \n", gettid());
 pthread_mutex_lock(&g_mutexChannelInfo);
 printf("main! locked \n", gettid());
 while (1) {
  printf("main!  %5u \n", gettid());
  sleep(1);
 }
 printf("main! begin unlock \n", gettid());
 pthread_mutex_unlock(&g_mutexChannelInfo);
 printf("main! unlocked \n", gettid());
 return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值