2013-04-10 6 views
1

이것은 부스트 ​​ipc 라이브러리와 관련된 두 번째 게시물입니다. 내가 웹에서 기존의 일부 사례를 사용할 수 살펴볼 것이다 그렇게 생각 내가 이해할 수없는 교착 상태에 직면하고있어프로세스 간 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 

내가

어떤 도움/아이디어 우분투 12.04에 GCC 4.7로 컴파일하는거야?

추신 :이 작업을 시도하고 교착 상태에 직면 한 경우 공유 객체를 지우기 위해 마지막에 제거 명령을 실행하는 독립 실행 형 프로그램을 유지하십시오. 그렇지 내가 그것에서 시작 것이기 카운터는 현재 상태, 그리고 0

답변

0

내가 분명히 생각 : 문서에 따라 통보를 메소드는 이미 스레드 (또는 그 이상)가 대기중인 경우를 제외하고는 효과가 있습니다. 그리고 제공된 예제에서 모든 프로세스는 wait()에 도달하기 전에 notify_all()을 실행합니다.