Возможно, официанты принадлежат нескольким адресным пространствам, каждое из которых сопоставило мьютекс, связанный с фьютексом, по другому адресу в памяти.Я не уверен, безопасно ли использовать FUTEX_REQUEUE
, когда точка запроса может не отображаться на один и тот же адрес во всех официантах;если это так, то это не проблема.
Есть другие проблемы, которые не будут обнаружены надежными фьютексами;например, если выбранный вами официант занят обработчиком сигнала, вы могли бы ждать сколько угодно долго. [Как обсуждалось в комментариях, это не проблема]
Обратите внимание, что с надежнымfutexes, вы должны установить значение futex & 0x3FFFFFFF
в качестве TID потока, который нужно разбудить;Вы также должны установить бит FUTEX_WAITERS
, если вы хотите активировать.Это означает, что вы должны выбрать, какой поток пробудить из потока вещания, иначе вы не сможете иметь дело со смертью потока сразу после FUTEX_WAKE
.Вам также необходимо разобраться с возможностью смерти потока непосредственно перед тем, как поток waker записывает свой TID в переменную состояния - возможно, имеет поле 'pending master', которое также зарегистрировано в надежной системе мьютекса.было бы хорошей идеей.
Я не вижу причин, почему это не может сработать, если вы внимательно следите за выходом из потока.Тем не менее, может быть, лучше всего просто определить в ядре расширение FUTEX_WAIT
, которое принимает точку реквизита и значение сравнения в качестве аргумента, и позволить ядру обрабатывать это простым, не требующим гонки способом.