Здравствуйте, 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++ [смех].