Я думаю, вам следует переосмыслить то, что вы пытаетесь сделать. Если вы пытаетесь оптимизировать свою производительность, вы, вероятно, ошибаетесь.
pthread_cond_signal()
даже не гарантирует разблокировку ровно одного потока — это гарантированно разблокирует по крайней мере один поток, поэтому ваш код лучше сможет справиться с ситуацией, когда несколько потоков разблокированы одновременно. Типичный способ сделать это состоит в том, чтобы каждый поток повторно проверял условие после разблокировки и, если оно ложно, снова возвращался к ожиданию.
Вы можете реализовать какую-то схему, в которой вы держите свою собственную приоритетную очередь ожидающих потоков, и каждый поток добавляет себя в эту очередь непосредственно перед тем, как начать ожидание, а затем он будет проверять очередь при разблокировке, но это добавит много сложности и большой потенциал для серьезных проблем (условия гонки, взаимоблокировки и т. д.). Также было добавлено нетривиальное количество накладных расходов.
Кроме того, что произойдет, если поток с более высоким приоритетом начнет ожидать условную переменную в тот же момент, когда эта условная переменная получает сигнал? Кто разблокируется, вновь прибывший поток с высоким приоритетом или прежний поток с наивысшим приоритетом?
Порядок, в котором потоки разблокируются, полностью зависит от планировщика потоков ядра, так что вы в его власти. Я бы даже не стал предполагать порядок FIFO.
person
Adam Rosenfield
schedule
07.11.2009