【问题标题】:Multi thread program with Timer and Signals带定时器和信号的多线程程序
【发布时间】:2016-10-18 13:46:47
【问题描述】:

我是多线程编程的新手,所以这个问题可能看起来有点傻,Follow 是我的代码,我正在尝试有 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

【问题讨论】:

  • Function2 执行了吗?
  • 是的,它执行正确

标签: c++ multithreading signals ubuntu-14.04


【解决方案1】:

来自the setitimer manual page

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

您试图拥有两个相同类型的计时器,这是不可能的。

如果您想拥有多个计时器,则需要另一种解决方案。

【讨论】:

  • 非常感谢,请您提供有关我可以使用的方式的更多信息。
【解决方案2】:

信号不适用于线程。

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

即使您有每个线程的信号处理程序,也会向整个进程发送信号。因此,一个随机线程将处理信号,而所有其他线程则不会。

您可以使用pthread_sigmask 指定要处理信号的线程。但总的来说,混合信号和多线程根本无法正常工作。

在这里,您有一些类似的问题可能会更多地阐明这一点。他们可能会谈论pthread 而不是std::thread,但那里的问题是一样的。

Signal handling in pthreads

POSIX threads and signals

【讨论】:

  • 那么,你说信号和多线程根本不工作,你怎么看多进程?它对我有帮助吗?
  • @Ss.unix 这取决于你的目标是什么。多处理有其优点,而线程也有其优点。但这是另一回事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 2014-08-29
  • 2018-06-04
相关资源
最近更新 更多