2012-12-21 3 views
0

watchdir을 사용하여 내부 컬렉션에 항목을 추가하는 서버에서 작업하고 있습니다.boost :: mut를 포함하는 클래스에 boost :: bind 사용하기

this->watchDirThread = new boost::thread(boost::bind(&Filesystem::watchDirThreadLoop, 
                 this, 
                 this->watchDir, 
                 fileFoundCallback)); 

fileFoundCallback 매개 변수는 boost::bind을 통해 생성됩니다 : :이 watchdir는 다음과 같이 생성되는 스레드에 의해 주기적으로 탐색한다

boost::bind(&Collection::addFile, this->collection, _1) 

내가 뮤텍스를 사용하여 동시 액세스에서 내 컬렉션을 보호하고자하는 내 문제는 boost::mutex 클래스가 복사 할 수 없으므로 boost::bind에 복사 가능 매개 변수가 필요하므로 내 Collection 클래스에 뮤텍스를 사용할 수 없습니다.

정적 뮤텍스에 대한 아이디어가 마음에 들지 않습니다. 뮤텍스의 역할은 의미 상으로 잘못 될 수 있습니다. 여기서는 수정되는 동안 내 컬렉션을 읽지 않도록하는 것입니다.

이 문제를 해결하려면 어떻게해야합니까?

답변

3

mutex 주위에 std::ref or std::cref을 사용하십시오.

boost::mutex yourmutex; 
boost::bind(..., yourmutex, ...); 

쓰기 :

boost::mutex yourmutex; 
boost::bind(..., std::ref(yourmutex), ...); 
그 대신에,이다
관련 문제