Есть ли способ убедиться, что заблокированные потоки проснулись в том же порядке, в каком они были заблокированы? Я где-то читал, что это будет называться "сильным замком", но я не нашел на этом никаких ресурсов.
В Mac OS X можно создать очередь FIFO, в которой хранятся все идентификаторы потоков заблокированных потоков, а затем использовать функцию nifty pthread_cond_signal_thread_np()
, чтобы разбудить один конкретный поток, который явно нестандартен и не переносится.
Один из способов, который я могу представить, - использовать аналогичную очередь, а в точке unlock()
отправить a broadcast()
ко всем потокам и проверить, какая из них следующая в строке.
Но это вызвало бы много накладных расходов.
Путь к проблеме будет заключаться в том, чтобы выдать packaged_task в очередь и обработать их по порядку. Но это больше похоже на обходное решение для меня, чем решение.
Edit:
Как отмечалось в комментариях, этот вопрос может казаться несущественным, поскольку в принципе нет гарантированного упорядочения попыток блокировки.
В качестве пояснения:
У меня есть что-то, что я называю ConditionLockQueue, который очень похож на класс NSConditionLock в библиотеке Cocoa, но он поддерживает очередь FIFO заблокированных потоков вместо более или менее случайного пула.
По существу любой поток может "выстраиваться в линию" (с требованием или без требования конкретного "условия" - простого целочисленного значения - для удовлетворения). Затем поток помещается в очередь и блокируется до тех пор, пока он не станет самым передним элементом в очереди, состояние которой выполнено.
Это обеспечивает очень гибкий способ синхронизации, и я нашел его очень полезным в моей программе.
Теперь мне действительно нужен способ пробудить конкретный поток с определенным идентификатором.
Но эти проблемы почти одинаковы.