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;
}

加载中…