这种情况总是经常发生:我们有一些线程和一个共享对象,我们需要确保任何时候只有一个线程可以修改该对象。
那么,显而易见的解决方案是使用lock the door-do the job-get out of there
成语。在这种情况下,我总是使用 POSIX 互斥锁。例如
pthread_mutex_lock(&this->messageRW); // lock the door
P_Message x = this->messageQueue.front(); // do the job
this->messageQueue.pop();
pthread_mutex_unlock(&this->messageRW); // get out of there
// somewhere else, in another thread
while (true) {
P_Message message;
solver->listener->recvMessage(message);
pthread_mutex_lock(&(solver->messageRW)); // lock the door
solver->messageQueue.push(message); // do the job
pthread_mutex_unlock(&(solver->messageRW)); // get out of there
sem_post(&solver->messageCount);
}
我messageQueue
在代码中的很多地方都使用过。所以最终得到了很多不优雅的锁定/解锁对。我认为应该有一种方法可以声明messageQueue
为应该在线程之间共享的对象,然后线程 API 可以处理锁定/解锁。我可以想到一个包装类,或者类似的东西。尽管其他 API(增强线程或其他库)也可以接受,但基于 POSIX 的解决方案是首选。
在类似的情况下你会实施什么?
为未来的读者更新
我找到了这个。我猜这将成为 C++14 的一部分。