今天接手了一个工程模块,它使用信号做为系统的时钟基准,在回调函数里还用了锁,不晓得这种设计是否合理。
我的疑问:信号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;
}