2016-10-18 109 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