我正在使用队列在两个线程之间进行通信(一个只是生成自定义类的实例并将指针推送到队列,另一个从自定义类的队列指针中读取并进行一些计算)。如何使队列上的推送和弹出原子化,如何锁定这些操作?(我不能使用 C++11 标准)
问问题
2200 次
2 回答
9
最可移植的非 C++11 锁定机制可能是来自Boost.Thread库的同步类型。特别是mutex类为您提供了一个简单的可锁定对象,用于提供对资源的独占访问权限。例如:
#include <boost/thread/mutex.hpp>
#include <queue>
template <typename T>
class locking_queue {
public:
void push(T const & value) {
boost::mutex::scoped_lock lock(mutex);
queue.push(value);
}
bool pop(T & value) {
boost::mutex::scoped_lock lock(mutex);
if (queue.empty()) {
return false;
} else {
value = queue.front();
queue.pop();
return true;
}
}
private:
std::queue<T> queue;
boost::mutex mutex;
};
另一个优点是它与 C++11std::mutex
类非常相似,如果您决定改用它,这将使转换变得非常简单。
于 2012-07-27T11:15:48.347 回答
3
这是一个伪代码:
// Thread A
mutex.lock();
q.push();
mutex.unlock();
// Thread B
mutex.lock();
q.pop();
mutex.unlock();
如果你正在使用 boost,你可以试试它的mutex类。
于 2012-07-27T11:05:35.653 回答