Re: Многопоточная программа на Си зависает
От: andrey.desman  
Дата: 10.10.13 22:10
Оценка:
Здравствуйте, Sorc17, Вы писали:

S>Всем привет.


S>Я постигаю многопоточное программирование и сегодня уперся в совершенно не понятное мне поведение своей программы. Вот её тестовый вариант: http://pastebin.com/S6bHbXcU скомпилить можно так: gcc -lpthread test.c -o test Почитал маны по pthread_cancel и pthread_mutex_lock и погуглил и всё равно не пойму, почему программа зависает (блокируется в одном из pthread_join навечно), ведь я освобождаю мьютекс после cancel-ов. И совсем уже взрывает мой мозг то, что если я оставляю константу TEST не объявленной, чтобы убрать вывод из потоков, то сколько программу не запускай, она не виснет. А если константу TEST объявить, то программа зависает через раз.


S>Подскажите пожалуйста, что я делаю не так


Убери test("got lock") и все должно заработать.

Что происходит:
Создаются три потока, которые тут же вешаются на мютекс локе.
Мэйн отпускает лок при вызове cond_wait (кстати учти, что он может без причины просыпаться, всегда нужно условие / булевская переменная).
Один из потоков захватывает мютекс, сигналит и отпускает лок.
Управление переходит обратно в мэйн, который вызывает cancel для всех потоков.
Мэйн отпускает мютекс.
Мютекс захватывается другим потоком.
Он вызывает write(), который есть cancellation point. Тот самый test("got lock").
Поток останавливается без отпускания мютекса.
Третий поток все еще ждет мютекса.
Мэйн все еще ждет завершения третьего потока. Пичалька.

ДимДимыч очень сильно прав насчет pthread_cancel().
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.