2016-10-18 74 views
1

我非常初来乍到的多线程编程,所以这个问题似乎有点傻,遵循的是我的代码,我想有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我的输出

+0

不函数2执行? – Hayt

+0

是的,它正确执行 –

回答

1

the setitimer manual page

一个进程只有每个的T之一三种类型的定时器。

您试图让两个相同类型的定时器,这是不可能的。

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

+0

Thenks很多,请你给我关于我可以使用的方式的信息。 –

0

信号与线程无法正常工作。

他们也不会每个线程工作,但每个进程。你正在做的是首先将SIGALRM信号处理程序设置为Function1,然后你开始一个线程,然后你改写处理程序来调用Function2来代替。

即使你有每个线程的信号处理程序信号发送到整个过程。所以一个随机线程将处理信号,并且所有其他线程都不会运行。

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

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

Signal handling in pthreads

POSIX threads and signals

+0

所以,你说信号和多线程根本不起作用,你怎么看待多进程?它帮助我吗? –

+0

@ Ss.unix这取决于你的目标是什么。多线程有它的优势,而线程也有它们的优势。但这是另一场辩论。 – Hayt