Название: Не отрабатывает сигнал если для синхронизации используется мьютекс Отправлено: Roman от Июнь 17, 2016, 00:58 Привет всем.
В своем рабочем проекте я столкнулся с тем, что посланный сигнал не доходит до получателя. Есть два потока и один из по завершении некоторой работы сообщает второму об этом. Все хорошо было до тех пор, пока я не стал использовать мьютексы для дополнительный синхронизации. Теперь я понимаю, что проблема была прежде всего в дизайне. Но если не брать это в расчет хотелось все же понять что неправильно и что является источником проблемы. Я написал тестовый проект, который в общем показывает суть проблемы. Код: #ifndef TESTCLASSES_H Если убрать мьютекс то все окей. Я не понимаю почему он лочит процесс Worker . Ведь поток Finisher посылает сигнал finished, что по идее дергает метод releasemutex Название: Re: Не отрабатывает сигнал если для синхронизации используется мьютекс Отправлено: Kurles от Июнь 17, 2016, 01:13 потому что у тебя слот releasemutex пытается вызваться в контексте event loop'а заблокированного потока. Если переписать строчку
Код на Код то будет ожидаемое тобой поведение. Название: Re: Не отрабатывает сигнал если для синхронизации используется мьютекс Отправлено: Igors от Июнь 17, 2016, 14:46 то будет ожидаемое тобой поведение. А чего это мутекс захваченный одной ниткой освобождается другой? Так нельзяКод: void init() Название: Re: Не отрабатывает сигнал если для синхронизации используется мьютекс Отправлено: Roman от Июнь 20, 2016, 13:03 А почему нельзя? Я новичек в задачах синхронизации, почему нельзя освобождать мьютекс из другого потока?
Название: Re: Не отрабатывает сигнал если для синхронизации используется мьютекс Отправлено: Igors от Июнь 20, 2016, 13:40 А почему нельзя? Я новичек в задачах синхронизации, почему нельзя освобождать мьютекс из другого потока? Потому что данный примитив синхронизации устроен так: освободить мутекс может (и должен) только тот кто его захватил. Если же требуется освобождать из другой нитки - используйте др примитив QSemaphore, вот для него пожалуйста |