Я пытаюсь синхронизировать два потока (работающих на одной карте C ++), используя библиотеку Boost. Я должен сказать, что я не эксперт в C ++, и я нахожу документацию по надстройке довольно сложной для понимания.
То, чего я хочу достичь, это что-то вроде этого:
#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
Я пытался использовать Mutex и condition_variables, но код не работал должным образом. В частности, когда 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();
...