提升进程间ipc死锁

时间:2013-04-10 07:50:45

标签: c++ boost ipc deadlock futex

这是我关于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

我正在使用ubuntu 12.04上的gcc 4.7进行编译

任何帮助/想法为什么会发生这种情况?

PS:请注意,如果您尝试此操作,并且遇到死锁,请保留一个独立的程序,该程序只执行末尾的删除命令以清除共享对象。否则我的计数器将从它的当前状态开始,而不是从0开始。

2 个答案:

答案 0 :(得分:0)

使用一些最新的升级版本报告错误: https://svn.boost.org/trac/boost/ticket/7682

答案 1 :(得分:0)

我认为很清楚:根据文档,通知方法有效,除非已经有一个(或更多)线程等待。在提供的示例中,可能会发生所有进程在任何进程到达wait()之前执行notify_all()。