2016-10-18 3 views
1

Я очень новичок в мульти программирования потоков, так что этот вопрос может показаться немного глупым, 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 на моем выходе

+0

ли Function2 выполнить? – Hayt

+0

Да, он правильно выполняет –

ответ

1

от the setitimer manual page

процесс имеет только один из каждого из т hree типов таймеров.

Вы пытаетесь иметь два таймера того же типа, это невозможно.

Если вы хотите иметь несколько таймеров, потребуется другое решение.

+0

. Так что, пожалуйста, дайте мне более подробную информацию о том, как я могу использовать. –

0

Сигналы плохо работают с потоками.

Они также не работают нитью, но за процесс. То, что вы делаете, сначала устанавливает обработчик сигнала SIGALRM на Function1, затем вы начинаете поток, а затем перезаписываете обработчик для вызова Function2.

Даже если у вас есть обработчик сигнала на потоке, сигнал посылается на весь процесс. Таким образом, один случайный поток будет обрабатывать сигнал, а все остальные - не будут.

Вы можете указать, какой поток вы хотите обработать с помощью сигнала pthread_sigmask. Но в целом сигналы смешивания и многопоточность не работают вообще.

Здесь у вас есть некоторые подобные вопросы, которые могут светить на этом больше. Они могут говорить о pthread вместо std::thread, но проблемы там же.

Signal handling in pthreads

POSIX threads and signals

+0

Итак, вы говорите, что сигналы и многопоточность не работают вообще, что вы думаете о мультипроцессе? это hep меня? –

+0

@ Ss.unix это зависит от вашей цели. Многопроцессорность имеет свои преимущества, а потоки также имеют свои. Но это еще одна дискуссия. – Hayt