Я использую g ++ версии 4.4.3 (Ubuntu 4.4.3-4ubuntu5
) и libpthread v. 2-11-1. Следующий код просто создает поток, выполняющий Foo()
, и немедленно отменяет его:
void* Foo(void*){
printf("Foo\n");
/* wait 1 second, e.g. using nanosleep() */
return NULL;
}
int main(){
pthread_t thread;
int res_create, res_cancel;
printf("creating thread\n);
res_create = pthread_create(&thread, NULL, &Foo, NULL);
res_cancel = pthread_cancel(thread);
printf("cancelled thread\n);
printf("create: %d, cancel: %d\n", res_create, res_cancel);
return 0;
}
Вывод, который я получаю:
creating thread
Foo
Foo
cancelled thread
create: 0, cancel: 0
Почему второй Foo
выход? Злоупотребляю ли я pthread API, вызывая pthread_cancel
сразу после pthread_create
? Если так, как я могу знать, когда можно безопасно коснуться нити? Если я вставлю printf () между ними, у меня не возникнет этой проблемы.