以下是一个简单的C++无锁消息队列的实现示例:
#include <atomic>
#include <iostream>
#include <thread>
#include <vector>
template<typename T>
class LockFreeQueue {
private:
struct Node {
T data;
Node* next;
};
std::atomic<Node*> head;
std::atomic<Node*> tail;
public:
LockFreeQueue() : head(nullptr), tail(nullptr) {}
void Enqueue(const T& value) {
auto newNode = new Node();
newNode->data = value;
newNode->next = nullptr;
Node* currTail = tail.load(std::memory_order_relaxed);
while (true) {
Node* currNext = currTail->next;
if (currNext == nullptr) {
if (tail.compare_exchange_weak(currTail->next, newNode,
std::memory_order_release, std::memory_order_relaxed)) {
break;
}
} else {
tail.compare_exchange_weak(currTail, currNext,
std::memory_order_release, std::memory_order_relaxed);
}
}
}
bool Dequeue(T& value) {
Node* currHead = head.load(std::memory_order_relaxed);
while (true) {
Node* currTail = tail.load(std::memory_order_acquire);
Node* currNext = currHead->next;
if (currHead == currTail) {
if (currNext == nullptr)
return false;
tail.compare_exchange_weak(currTail, currNext,
std::memory_order_release, std::memory_order_relaxed);
} else {
value = currNext->data;
if (head.compare_exchange_weak(currHead, currNext,
std::memory_order_release, std::memory_order_relaxed)) {
delete currHead;
break;
}
}
}
return true;
}
};
// 测试示例
void Producer(LockFreeQueue<int>& queue, int id) {
for (int i = 0; i < 10; ++i) {
queue.Enqueue(id * 100 + i);
std::this_thread::sleep_for(std::chrono::milliseconds(200));
}
}
void Consumer(LockFreeQueue<int>& queue, int id) {
int value;
while (queue.Dequeue(value)) {
std::cout << "Consumer " << id << ": " << value << std::endl;
}
}
int main() {
LockFreeQueue<int> queue;
std::vector<std::thread> producers;
for (int i = 1; i <= 3; ++i) {
producers.emplace_back(Producer, std::ref(queue), i);
}
std::vector<std::thread> consumers;
for (int i = 1; i <= 2; ++i) {
consumers.emplace_back(Consumer, std::ref(queue), i);
}
for (auto& t : producers)
t.join();
for (auto& t : consumers)
t.join();
return 0;
}
你可以将上述代码保存为 lock_free_queue.cpp,然后使用C++编译器进行编译:
g++ -std=c++11 -o lock_free_queue lock_free_queue.cpp
运行生成的可执行文件:
./lock_free_queue
这样就可以测试无锁消息队列的功能了。请注意,在不同平台和编译器中,对于无锁操作的支持可能会有所差异。因此,您可能需要根据实际情况进行适当的调整和优化。
内容由零声教学AI助手提供,问题来源于学员提问




