多线程程序与定时器和信号

Multi thread program with Timer and Signals

本文关键字:信号 定时器 程序 多线程      更新时间:2023-10-16

我是多线程编程的新手,所以这个问题可能看起来有点傻,下面是我的代码,我试图有2个线程:

struct sigaction    S1,S2;
struct itimerval    T1,T2;
void Function1(){
    cout<<"Function1 "<<endl;
}   
void Function2(){
    cout<<"Function2 "<<endl;
} 
void Thread_Function(){
    int t=70000;
    memset (&s2, 0, sizeof (s2));
    s2.sa_handler = &Function2;
    sigaction (SIGALRM, &s2, NULL);
    sigemptyset(&s2.sa_mask);
    s2.sa_flags = 0;
    T2.it_value.tv_sec = 0;
    T2.it_value.tv_usec =t;
    T2.it_interval.tv_sec =0;
    T2.it_interval.tv_usec =t;
    setitimer (ITIMER_REAL, &T2, NULL);
} 
int main(){
    int t=50000;
    memset (&s1, 0, sizeof (s1));
    s1.sa_handler = &Function1;
    sigaction (SIGALRM, &s1, NULL);
    sigemptyset(&s1.sa_mask);
    s1.sa_flags = 0;
    T1.it_value.tv_sec = 0;
    T1.it_value.tv_usec =t;
    T1.it_interval.tv_sec =0;
    T1.it_interval.tv_usec =t;
    setitimer (ITIMER_REAL, &T1, NULL);
    thread t1(Thread_Function);        
}

问题是Function1没有执行换句话说,我在输出中看不到Function1

来自setitimer手册页

一个进程只有三种定时器中的一种。

您正在尝试使用两个相同类型的计时器,这是不可能的。

如果你想有多个计时器,需要另一个解决方案。

信号不能很好地处理线程。

它们也不是每个线程工作,而是每个进程工作。您正在做的是首先将SIGALRM信号处理程序设置为Function1,然后启动一个线程,然后覆盖处理程序以调用Function2

即使你使用单线程信号处理程序,信号也会发送到整个进程。因此,一个随机线程将处理信号,而所有其他线程不会。

你可以用pthread_sigmask指定你想处理这个信号的线程。但是一般来说,混合信号和多线程并不能很好地工作。

这里你有一些类似的问题,可能会对这个问题有更多的启发。他们可能会谈论pthread而不是std::thread,但问题是一样的。

pthreads中的信号处理

POSIX线程和信号