加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

c++无锁队列-----资源共享

(2025-04-26 22:21:37)
分类: 资本投资
#include
#include
#include
#include
#include

template
class LockFreeStack {
private:
struct Node {
T data;
Node* next;
Node(const T& value) : data(value), next(nullptr) {}
};
std::atomic head;

public:
LockFreeStack() : head(nullptr) {}

void push(const T& value) {
Node* newNode = new Node(value);
newNode->next = head.load();
while (!head.compare_exchange_weak(newNode->next, newNode)) {}
//这个循环体为空,一直在while里面判断并交换,直到交换成功执行,然后,!之后,条件不成立了,继续后面执行
std::cout << "Thread " << std::this_thread::get_id() << " (   pushed: " << value << std::endl;
}
bool pop(T& value) {
Node* oldHead = head.load();
while (oldHead && !head.compare_exchange_weak(oldHead, oldHead->next)) {}
//oldHead:检查 oldHead 是否为空。如果 oldHead 为空,说明栈为空,循环条件不满足,跳出循环。
//!head.compare_exchange_weak(oldHead, oldHead->next):是 compare_exchange_weak 操作取反。
//compare_exchange_weak 是一个原子操作,用于比较 head 的当前值是否等于 oldHead,如果相等,则//将 head 的值更新为 oldHead->next,并返回 true;
//如果不相等,则将 oldHead 更新为 head 的当前值,并返回 false。
//取反后,如果比较并交换操作失败(即有其他线程修改了栈顶指针),循环条件满足,继续循环;如果比较//并交换操作成功,循环条件不满足,跳出循环。
//循环体:循环体为空,这意味着只要循环条件满足,就会不断重复执行比较并交换操作,直到条件不满足为止。

if (oldHead) {
value = oldHead->data;
delete oldHead;
std::cout << "Thread " << std::this_thread::get_id() << "  popped: " << value << std::endl;
return true;
}
return false;
}
};

void worker(LockFreeStack& stack, int id) {
for (int i = 0; i < 3; ++i) {
stack.push(i * id);
std::cout << "########################################################################Thread Noworker. " << id << " push: " << i * id << std::endl; // 在pop函数中
// 休眠 5 秒
std::this_thread::sleep_for(std::chrono::seconds(5));

int value;
if (stack.pop(value)) {
// 这里可以处理弹出的值
std::cout << "########################################################################Thread Noworker. " << id << " popped: " << value << std::endl; // 在pop函数中
std::chrono::milliseconds(3);
}
}
}

int main() {
LockFreeStack stack;
std::vector threads;

for (int i = 0; i < 2; ++i) {
threads.emplace_back(worker, std::ref(stack), i);
}

for (auto& t : threads) {
t.join();
}
std::cout << "All threads finished." << std::endl;
return 0;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有