如何使推送和弹出队列成为原子,如何锁定这些操作
How to make push and pop on queue atomic, how to lock those operations?
我使用队列在两个线程之间进行通信(一个线程只生成自定义类的实例并将指针推送到队列,另一个线程从自定义类上的队列指针中读取并进行一些计算)。如何使推送和弹出队列成为原子,如何锁定这些操作?(我不能使用C++11标准)
可能最可移植的非C++11锁定机制是Boost.Thread库中的同步类型。特别是互斥类为您提供了一个简单的可锁定对象,用于对资源进行独占访问。例如:
#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++11 std::mutex
类非常相似,如果您决定使用它,它将使转换变得非常简单。
这里有一个伪代码:
// Thread A
mutex.lock();
q.push();
mutex.unlock();
// Thread B
mutex.lock();
q.pop();
mutex.unlock();
如果您正在使用boost,您可以尝试它的互斥类。
相关文章:
- 如何找到锁定Linux futex的C++行
- G锁定铸造到基础上会释放模拟行为
- 如何检查线程是否锁定
- 如何在C++中找到active directory中禁用和锁定的窗口帐户
- 我应该在锁定TBitmap画布后解锁它吗
- C++ 11 中的锁定是否保证访问数据的新鲜度?
- 在两个线程上读/写 64 位,无互斥/锁定/原子
- 如何在实时应用程序中锁定线程
- 在 lambda 中锁定 std::shared_ptr 的复制操作
- 使用简单两相锁定的并发程序
- 锁定来自其他线程的类成员
- 他们如何将红外锁定像素转换为镜头前方 1m 的正常平面上的位置
- 同一互斥锁顺序上的锁定和解锁是否一致?
- 共享内存的升压容器是否实现锁定?
- 当只有一个线程主要使用该对象而其他线程很少使用它时,如何最小化该对象的互斥锁锁定?
- 如何在 x86 处理器上实现"锁定添加"
- MCS 锁定实现的问题
- Sqlite3 C++数据库被锁定
- 如果互斥锁被锁定,则安全地跳过任务
- 错误:"shared_mutex"不是使用读取器锁定 = std::shared_lock<std::shared_mutex> 的"std"的成员;