Повысить межпроцессный 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 (...);

0 ответов

Другие вопросы по тегам