부스트 라이브러리를 사용하여 두 개의 스레드 (동일한 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();
...
일부 코드를 보여줍니다. –
실제 스레드가 수행중인 작업에 코드를 추가해야합니다.thread2가 깨어나서 깨어나서 *지도에 직접 액세스하지 못했을 때 * 디버깅하기가 어렵습니다 * ... 설명은 단일 생산자와 단일 소비자가 있음을 나타냅니다. 지도*. 스레드가 2 개뿐입니까? 그들은 정말로지도를 공유하고 있습니까? –
예, 그들은 일종의 컨테이너 인지도를 실제로 공유하고 있습니다. 두 스레드는 물건을 넣거나 빼낼 수 있습니다. 때때로 발생하는 일은 thread1이 차례로 두 번 액세스를 얻는 것입니다. 처음으로 뭔가를 놓았습니다. 한편 thread2는 알림을 보았 기 때문에 깨어났습니다. 하지만 thread2가 실행되기 전에 thread1이 다시 실행되고 이번에는 맵에서 항목을 제거합니다. 설명하기에 너무 지저분해서 죄송합니다. 충분히 명확하길 바랍니다. P – Danilo