2013-06-03 2 views
0

Я работаю над Ubuntu 12.04.2 LTS. У меня странная проблема с pthread_kill(). Следующая программа заканчивается после записи только "Create thread 0!" на стандартный вывод. Программа заканчивается статусом выхода 138.pthread_kill завершает вызов программы

Если я разорвал "usleep(1000);", все будет выполнено правильно. Почему это произойдет?

#include <nslib.h> 

void *testthread(void *arg); 

int main() { 

    pthread_t tid[10]; 
    int i; 

    for(i = 0; i < 10; ++i) { 
     printf("Create thread %d!\n", i); 
     Pthread_create(&tid[i], testthread, NULL); 
     //usleep(1000); 
     Pthread_kill(tid[i], SIGUSR1); 
     printf("Joining thread %d!\n", i); 
     Pthread_join(tid[i]); 
     printf("Joined %d!", i); 
    } 

    return 0; 
} 

void sighandlertest(int sig) { 

    printf("print\n"); 
    pthread_exit(); 
    //return NULL; 

} 

void* testthread(void *arg) { 

    struct sigaction saction; 

    memset(&saction, 0, sizeof(struct sigaction)); 
    saction.sa_handler = &sighandlertest; 
    if(sigaction(SIGUSR1, &saction, NULL) != 0) { 
     fprintf(stderr, "Sigaction failed!\n"); 
    } 
    printf("Starting while...\n"); 
    while(true) { 

    } 

    return 0; 

} 

ответ

1

Если основной поток не спит немного, прежде чем поднять SIGUSR1, обработчик сигнала для потока, созданного наиболее Propably не был установлен, поэтому действие по умолчанию для приема сигнала применяется, который закончив обработать.

Использование sleep() s для синхронизации потоков не рекомендуется, так как не гарантировано надежное. Используйте другую механику здесь. Пара подходящей/мьютекс подходит.

Объявить глобальное состояние переменной int signalhandlersetup = 0, защиты от доступа к нему с помощью мьютекса, создать нить, сделать основной поток в состоянии ожидания с помощью pthread_cond_wait(), пусть созданная нити настроить ручку сигнала для SIGUSR1, установите signalhandlersetup = 0, а затем сигнал состояния основной поток ожидает использования pthread_signal_cond(). Наконец, позвольте основному потоку позвонить pthread_kill(), как по вашей публикации.

Смежные вопросы