Это мой второй пост в связи с библиотеками 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.
Это сообщенная ошибка, использующая некоторые недавние версии наддува
https://svn.boost.org/trac/boost/ticket/7682
Я думаю, что это ясно: согласно документации, методы notify имеют эффект ho, если нет уже ожидающего потока (или более). И в приведенном примере может произойти, что все процессы выполняют notify_all () до того, как какой-либо из них достигнет wait ().