повысить межпроцессные тупики ipc

Это мой второй пост в связи с библиотеками boost ipc.
Я сталкиваюсь с непонятными тупиками, поэтому я решил изучить некоторые существующие примеры, доступные в Интернете.

Моя текущая проблема — только пробная версия предоставленного примера.

http://en.highscore.de/cpp/boost/interprocesscommunication.html

#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/sync/named_mutex.hpp>
#include <boost/interprocess/sync/named_condition.hpp>
#include <boost/interprocess/sync/scoped_lock.hpp>
#include <iostream>

int main()
{
boost::interprocess::managed_shared_memory   managed_shm(boost::interprocess::open_or_create, "shm", 1024);
int *i = managed_shm.find_or_construct<int>("Integer")(0);
boost::interprocess::named_mutex named_mtx(boost::interprocess::open_or_create, "mtx");
boost::interprocess::named_condition named_cnd(boost::interprocess::open_or_create, "cnd");
boost::interprocess::scoped_lock<boost::interprocess::named_mutex> lock(named_mtx);
while (*i < 10)
{
if (*i % 2 == 0)
{
++(*i);
named_cnd.notify_all();
named_cnd.wait(lock);
}
else
{
std::cout << *i << std::endl;
++(*i);
named_cnd.notify_all();
named_cnd.wait(lock);
}
}
named_cnd.notify_all();
boost::interprocess::shared_memory_object::remove("shm");
boost::interprocess::named_mutex::remove("mtx");
boost::interprocess::named_condition::remove("cnd");
}

Этот пример кода приводит к тупику для меня.
strace указывает на оба процесса:

  futex(0x...,FUTEX_WAIT,1,NULL

Я собираю с GCC 4.7 на Ubuntu 12.04

любая помощь / идеи, почему это происходит?

PS: обратите внимание, что если вы попробуете это, и вы окажетесь в тупике, оставьте отдельную программу, которая просто выполняет команды удаления в конце, чтобы очистить общие объекты. Иначе счетчик для меня начнется с его текущего состояния, а не с 0.

1

Решение

Это сообщенная ошибка, использующая некоторые недавние версии наддува
https://svn.boost.org/trac/boost/ticket/7682

0

Другие решения

Я думаю, что это ясно: согласно документации, методы notify имеют эффект ho, если нет уже ожидающего потока (или более). И в приведенном примере может произойти, что все процессы выполняют notify_all () до того, как какой-либо из них достигнет wait ().

0

По вопросам рекламы [email protected]