Можно ли реализовать правильный отказоустойчивый барьер общего доступа к процессу в Linux?

В прошлом вопросе я спросил о реализации барьеров pthread без гонок разрушения:

Как барьеры могут быть разрушены, как только pthread_barrier_wait возвращается?

и получен от Майкла Берра с помощью идеальное решение для локальных барьеров процесса, но не подходит для барьеров, разделяемых процессом. Позже мы проработали некоторые идеи, но так и не пришли к удовлетворительному выводу, и даже не начали разбираться в случаях сбоя ресурсов.

Возможно ли в Linux создать барьер, который удовлетворяет этим условиям:

  • Общий процесс (может быть создан в любой разделяемой памяти).
  • Безопасное отключение или уничтожение барьера из любого потока сразу после возврата из функции ожидания барьера.
  • Невозможно завершиться из-за сбоя выделения ресурсов.

Попытка Майкла решить проблему Случай с общим процессом (см. связанный вопрос) имеет неудачное свойство: какой-то системный ресурс должен быть выделен во время ожидания, что означает, что ожидание может завершиться неудачно. И неясно, что вызывающий может разумно сделать, когда ожидание барьера не удается, поскольку весь смысл барьера заключается в том, что небезопасно продолжать, пока оставшиеся N-1 потоки не достигнут его ...

Решение в пространстве ядра может быть единственным способом, но даже это сложно из-за возможности сигнала, прерывающего ожидание, без надежного способа его возобновления ...

11
задан Community 23 May 2017 в 12:24
поделиться