【问题标题】:Indicating which thread set up timer handler?指示哪个线程设置了计时器处理程序?
【发布时间】:2012-03-09 05:50:09
【问题描述】:

重温这个问题:

我有多个线程正在运行(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

如您所见,它会打印出不同的值。

【问题讨论】:

    标签: c multithreading timer handler


    【解决方案1】:

    您可以在调用处理程序时打印线程 ID:

    如果不能,请在处理程序周围编写一个函数包装器,并告诉您的代码调用包装器函数而不是直接调用处理程序。

    【讨论】:

    • +1。更多关于gettid vs pthread_self.
    • 这不是回答原始问题。我应该使用定时器的当前实现吗?我只想知道哪个线程使用 pthreads 调用了处理程序。
    【解决方案2】:

    POSIX chapter on Signal Generation and Delivery 声明:

    在生成时,应确定该信号是为进程还是为进程内的特定线程生成的。由可归因于特定线程的某些动作(例如硬件故障)生成的信号应为导致生成信号的线程生成。应为进程生成与进程 ID 或进程组 ID 或异步事件(例如终端活动)相关联的信号。

    我想知道您捕获的SIGALRM 信号是否不被视为可归因于特定线程的操作,例如硬件故障。听起来您的SIGALRM 信号属于第二类,并且正在为进程生成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      相关资源
      最近更新 更多