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

boost lockfree queue-boost无锁队列「建议收藏」例子如下:#include<iostream>#include<boost/lockfree/queue.hpp>intmain(){ boost::lockfree::queue<int,boost::lockfree::fixed_sized<false>>queue(128); for(inti=0;i<10000;i++) queue.push(i); while(!queue.empty())

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

例子如下:

#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.net/161714.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月19日 上午10:36
下一篇 2022年7月19日 上午10:46


相关推荐

  • 源码大全_怎么复制网页源代码

    源码大全_怎么复制网页源代码7000个源码批量下载7000个源码批量下载<type=”text/javascript”language=”JavaScript”>document.title=”7000个源码批量下载-“+document.titlehttp://asp.lt263.com/soft/SaGuestBook.rar安全天使字符界面留言本(SaGuestBook)htt…

    2022年10月8日
    4
  • 关于callee含义

    关于callee含义functionAaro List callback nbsp nbsp nbsp setTimeout function nbsp nbsp nbsp nbsp nbsp nbsp vartask nbsp nbsp nbsp nbsp nbsp nbsp if task List shift nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp task 执行函数 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp if List length0 递归分解 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp

    2026年3月18日
    2
  • java卸载不了_java卸载不了怎么处理?卸载时总出现这个

    java卸载不了_java卸载不了怎么处理?卸载时总出现这个windowsXP在安装有些软件时,会弹出警告框:“不能访问windowsInstaller服务,可能是你在安全模式下运行windows,或者windowsInstaller没有正确安装。请和你的支持人员联系以获得帮助。”的解决方案:windowsinstaller没有正确安装到服务里停掉windowsinstaller服务然后下载InstMsiW.exe右击msi.inf点击安装…

    2022年5月19日
    190
  • springboot整合dubbo+zookeeper

    springboot整合dubbo+zookeeperspringboot整合dubbo+zookeeper项目结构:注意:在做此demo之前应该先自行搭建好zookeeper环境也可以搭建dubbo监控环境1.随便创建一个项目,之后添加一个maven项目用于存放接口packagecom.wzb.service;/***@authorSatsuki*@time2019/8/2717:51*@descripti…

    2025年8月24日
    2
  • 计算机arp 各命令,ARP命令参数详解

    计算机arp 各命令,ARP命令参数详解Arp 显示和修改 地址解析协议 ARP 缓存中的项目 ARP 缓存中包含一个或多个表 它们用于存储 IP 地址及其经过解析的以太网或令牌环物理地址 计算机上安装的每一个以太网或令牌环网络适配器都有自己单独的表 如果在没有参数的情况下使用 则 arp 命令将显示帮助信息 语法 arp a InetAddr NIfaceAddr g InetAddr NIfaceAdd

    2026年3月18日
    2
  • 计算机应届生想成为人才,就不要去力扣刷题(文章合集)

    计算机应届生想成为人才,就不要去力扣刷题(文章合集)

    2026年3月13日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号