Странное поведение при создании и отмене потока в тесной последовательности - PullRequest
1 голос
/ 04 августа 2011

Я использую 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 () между ними, у меня не возникнет этой проблемы.

1 Ответ

0 голосов
/ 20 марта 2012

Я не могу воспроизвести это на немного более новой Ubuntu. Иногда я получаю один Foo, а иногда ни одного. Мне пришлось исправить несколько вещей, чтобы ваш код компилировался (отсутствующие заголовки, отсутствующий вызов какой-либо спящей функции, подразумеваемой комментарием, а строковые литералы не закрыты), которые указывают, что вы не вставили фактический код, который воспроизвел проблему. *

Если проблема действительно существует, это может указывать на проблему с отменой потока в библиотеке ввода-вывода glibc. Это похоже на то, как два потока делают flush(stdout) с одинаковым содержимым буфера. Теперь это никогда не должно происходить нормально, потому что библиотека IO является поточно-ориентированной. Но что, если есть некоторый сценарий отмены, такой как: у потока есть мьютекс на stdout, и он только что сделал сброс, но еще не обновил буфер, чтобы очистить вывод. Затем он отменяется, прежде чем он может это сделать, и основной поток снова сбрасывает те же данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...