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

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


AD>Что происходит:

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

AD>ДимДимыч очень сильно прав насчет pthread_cancel().


Вот я дерево, а ведь и правда! Спасибо, ребят

Даже можно больше сказать, когда тред заканселился во время владения мьютексом, мьютекс стал "abandoned":

Any mutexes that are held by a thread that terminates, are abandoned and are no longer valid. Subsequent calls by other threads that attempt to acquire the abandoned mutex (pthread_mutex_lock() or pthread_mutex_trylock()) fail with an EOWNERTERM error.


Ну и засада этот cancel ...
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.