重新审视这个问题:
我有多个线程在运行(pthreads api),每个线程都有自己的定时器,在一定的时间间隔后调用一个函数处理程序(int signum)。当这些线程调用处理程序并在函数处理程序中时,我如何知道哪个线程调用它?是否需要特定于线程的数据?
我注意到进入处理程序函数的线程与设置它的线程不同,因此调用pthread_self()不起作用。我该如何解决这个问题?
这是一个说明问题的小例子
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>
void handler(int);
void call_alarm();
void *setup(void*);
pthread_t p;
void handler(int signum)
{
printf("handler thread %lu\n", pthread_self());
}
void call_alarm()
{
static struct itimerval timer;
static struct sigaction sa;
printf("call_alarm %lu\n", (unsigned long)pthread_self());
sa.sa_handler = handler;
sa.sa_flags = SA_RESETHAND;
timer.it_value.tv_usec = 500;
timer.it_value.tv_sec = 0;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = 0;
sigaction(SIGALRM, &sa, 0);
setitimer(ITIMER_REAL, &timer, 0);
}
void *setup(void *param)
{
while(1)
{
printf("caller thread %lu\n", pthread_self());
call_alarm();
pause();
}
}
int main(void)
{
if(pthread_create(&p, NULL, setup, NULL));
while(1);
return 0;
}
输出:
caller thread 3086637968
call_alarm 3086637968
handler thread 3086640832
如您所见,它会打印出不同的值。
答案 0 :(得分:1)
您可以在调用处理程序时打印线程ID:
如果你不能,可以在处理程序周围编写一个函数包装器,并告诉你的代码调用包装器函数而不是直接调用处理程序。
答案 1 :(得分:0)
POSIX chapter on Signal Generation and Delivery州:
在生成时,应确定是为过程生成了信号还是为过程中的特定线程生成了信号。应该为导致生成信号的线程生成由可归因于特定线程的某些动作(例如硬件故障)生成的信号。应为流程生成与流程ID或流程组ID或异步事件(如终端活动)相关联生成的信号。
我想知道您捕获的SIGALRM
信号是否被视为可归因于特定线程的操作,例如硬件故障。听起来您的SIGALRM
信号属于第二类,并且正在为该过程生成。