Повысить межпроцессный sharable_lock, уведомить, когда все дочерние процессы разблокированы?
То, что я пытаюсь сделать, это иметь отображенный файл памяти, к которому имеют доступ родительский и дочерний процессы. Процессы используют память для обмена данными следующим образом:
- Родитель пишет данные
- Все дети читают данные
- Ребенок 0 перезаписывает данные
- Родитель читает новые данные
- Повторение
Мне удалось заставить его работать с 1 ребенком, используя interprocess_mutex, interprocess_condition и scoped_lock, как показано в документации.
Для N детей я думал, что буду использовать sharable_lock, где родитель получает эксклюзивную блокировку, записывает данные и ждет. Затем дети получат общий доступ, прочитают данные, потом ребенок 0 напишет, а затем они все разблокируют и уведомят родителя. Но я не уверен, как это сделать с помощью условной переменной (т. Е. Как я могу уведомить родителя, когда все дочерние элементы сделаны).
Вот как я делаю это для 1 ребенка:
Родительский код
for ( ... )
{
scoped_lock<interprocess_mutex> lock(tq->mutex);
if (tq->parent_done)
{
// parent waits
tq->child_running.wait(lock);
}
// read child data
// update data
// Notify child
tq->parent_running.notify_one();
// Mark parent to wait
tq->parent_done = true;
}
Код ребенка
do
{
scoped_lock<interprocess_mutex> lock(tq->mutex);
if (!tq->parent_done)
{
// child waiting
tq->parent_running.wait(lock);
}
// read data
if (child_rank == 0)
{
// update data
}
// Notify parent
tq->parent_done = false;
tq->child_running.notify_one();
} while (...);