前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >boost lockfree queue-boost无锁队列「建议收藏」

boost lockfree queue-boost无锁队列「建议收藏」

作者头像
全栈程序员站长
发布2022-09-09 11:00:58
9690
发布2022-09-09 11:00:58
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

例子如下:

代码语言:javascript
复制
#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,核心代码如下:

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档