2011-05-10 3 views
1

부스트 라이브러리를 사용하여 두 개의 스레드 (동일한 C++ 맵에서 작업 중)를 동기화하려고합니다. 나는 C++의 전문가가 아니며 boost 문서가 이해하기 어렵다는 것을 알아야한다. 내가 무엇을 달성하고자하는C++ : 스레드 동기화

,이 같은 것입니다 : 내가 뮤텍스와 condition_variables를 사용하려고

#Thread 1 
get access to the map 
put in something 
release access 

#Thread 2 
wait until map is empty 
when it's not empty anymore, wake up and gain access 
perform operations on one entry of the map 
leave access to somebody else 

하지만 코드가 제대로 작동되지 않았습니다. 구체적으로 말하면, thread2가 깨어 났을 때 (cond. 변수를 기다린 후에), 그것은 맵에 직접 액세스하지 못하고 있었지만, 액세스 할 수 있고 맵을 비운 다른 누군가가있었습니다. 따라서 세분화 오류가 발생했습니다.지도에 액세스 할 때지도가 비어있는 동안지도가 가득 찰 것으로 예상했기 때문입니다.

또한, mymutex.lock()과 같은 차이점과 boost::mutex::scoped_lock scopedLock(mutex_)과 같은 차이점을 이해하고 싶습니다. 또는 unique_lock 교육에 대한

감사합니다 :)

편집 : 여기 내 코드의 관련 부분을 추출하기 위해 노력했다. 내가 잘하는 방법 동기화 작품을 이해하지 못하기 때문에, (

//COMMON PART 
boost::mutex mutex1; 
boost::mutex mutex2; 
boost::condition_variable cond; 
boost::mutex::scoped_lock mutex2lock(mutex2); 

//THREAD 1 
... 
if(someCondition){ 
    mutex1.lock(); 
    map[id]=message; 
    cond.notify_one(); 
    mutex1.unlock(); 
} 
... 


//THREAD 2 
... 
cond.wait(mutex2lock); 
mutex.lock(); 
//Perform operation on map[id] 
doSomething(map[id])); 
mutex.unlock(); 
... 
+2

일부 코드를 보여줍니다. –

+1

실제 스레드가 수행중인 작업에 코드를 추가해야합니다.thread2가 깨어나서 깨어나서 *지도에 직접 액세스하지 못했을 때 * 디버깅하기가 어렵습니다 * ... 설명은 단일 생산자와 단일 소비자가 있음을 나타냅니다. 지도*. 스레드가 2 개뿐입니까? 그들은 정말로지도를 공유하고 있습니까? –

+0

예, 그들은 일종의 컨테이너 인지도를 실제로 공유하고 있습니다. 두 스레드는 물건을 넣거나 빼낼 수 있습니다. 때때로 발생하는 일은 thread1이 차례로 두 번 액세스를 얻는 것입니다. 처음으로 뭔가를 놓았습니다. 한편 thread2는 알림을 보았 기 때문에 깨어났습니다. 하지만 thread2가 실행되기 전에 thread1이 다시 실행되고 이번에는 맵에서 항목을 제거합니다. 설명하기에 너무 지저분해서 죄송합니다. 충분히 명확하길 바랍니다. P – Danilo

답변

1
boost::mutex::scoped_lock mutex2lock(mutex2); 

정확하게 이해할 수 있다면 뮤텍스의 길이만큼 지속되는 뮤텍스 2에 큰 잠금 장치가 있어야합니다.

두 번째 스레드의 컨텍스트 내에서 잠금을 설정하려는 경우가 있지만, 왜 condition_variable이 원하는지 잘 알지 못합니다.

원자 적으로 호출 lock.unlock() 및 블록, 현재의 thread : 사실

, condition_variable 자체가 문서를 읽고, 당신이 무엇을하고 있는지에 대한 조금 잘못된 것 같습니다. 스레드는 this-의 호출> notify_one (통보 할 때 차단을 해제) 또는 this-> notify_all(), 또는 설명이 그것을 실행할 수있는 느낌이 때 그냥 잠금을 해제 할 수 있습니다 나에게 보인다 외관상

합니다 (가능성이 시간을 기반으로) 가능성이 목록을 유효한지 확인하려면 확인해야 할 것 같지 않은 경우 condition_variable 사용할 계획이라면 다시 대기하십시오.

+0

힌트를 보내 주셔서 감사합니다! 문제는 당신이 묘사 한 것과 정확히 같습니다. Thread2는지도가 "유효"(비어 있지 않음) 상태가 될 때까지 대기합니다. 그것이 유효 할 때지도 상에 무언가가 있는지 확인해야합니다. – Danilo

2

는 또한, 내가 mymutex.lock 같은 무엇인가의 차이를 이해하고 싶습니다 ... 많은 이해)와하지 않을 수 있습니다 부름 boost :: mutex :: scoped_lock scopedLock (mutex_); 또는 unique_lock. "C++ RAII"에 대한

구글은 : mymutex.lock()

당신은 "수동으로"뮤텍스를 잠금있다. (그리고 나중에 "수동으로"잠금을 해제해야합니다.)

scoped_lock은 잠금 기능을 제공하며 범위 끝에서 자동 잠금 해제 기능을 제공합니다.