大家好,又见面了,我是你们的朋友全栈君。
例子如下:
#include <iostream>
#include <boost/lockfree/queue.hpp>
int main()
{
boost::lockfree::queue<int, boost::lockfree::fixed_sized<false> > queue(128);
for (int i = 0;i < 10000;i++)
queue.push(i);
while (!queue.empty())
{
int data = 0;
queue.pop(data);
std::cout << data << std::endl;
}
getchar();
return 0;
}
LockFree的基础知识涉及:Atomic(原子操作),CAS(Compay and swap),内存预分配;
Atomic原子操作是无锁的核心实现,原子操作的实质是通过使用CPU的一些特殊指令(通常为汇编代码指令)或操作系统封装的一些内存锁定接口(系统封装的内存保护接口)来对指定长度的内存进行访问和修改,因为访问内存的原子性从而实现上层接口的无锁操作; CAS,核心代码如下:
int compare_and_swap ( int * reg, int oldval, int newval)
{
ATOMIC();
int old_reg_val = *reg;
if (old_reg_val == oldval)
*reg = newval;
END_ATOMIC();
return old_reg_val;
}
实质是通过不断比较预期值和当前值之间的数值从而决定是否需要交换保护内存中的内容。
lock-free和wait-free的区别: 阻塞算法可能会出现整个系统都挂起的情况(占有锁的线程被中断,无法释放所,那么所有试图争用这个锁的线程会被挂起),系统中的所有线程全部饿死。 无锁算法可以保证系统中至少有一个线程处于工作状态,但是还是可能有线程永远抢不到资源而被饿死。 无等待算法保证系统中的所有线程都能处于工作状态,没有线程会被饿死,只要时间够,所有线程都能结束。相比于无锁算法,无等待算法有更强的保证。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/161714.html原文链接:https://javaforall.cn