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


相关推荐

  • linux常用命令make_linux建立makefile

    linux常用命令make_linux建立makefile概述博客内容包含linux下make命令的使用与makefile的书写规则等,希望通过本文档使读者对make命令makefile文件有进一步了解,由于鄙人经验学识有限文档中会有描述不准确以及理解偏差,欢迎读者指正。fythons@sina.com从一只猫说起hellokitty linux系统中的make命令与makefile文件make与makefile 在linux系统…

    2022年4月19日
    72
  • 如何清理 WinSxS 文件夹-2022版

    如何清理 WinSxS 文件夹-2022版原文链接目录使用 Dism exe 手动删使用 StartCompone 参数将 ResetBase 开关与 StartCompone 参数一起使用使用 SPSuperseded 参数 PS 不要直接删除 WinSxS 文件夹 您可以使用 Windows 内置的工具来减小 WinSxS 文件夹的大小 从 WinSxS 文件夹中删除文件或删除整个 WinSxS 文件夹可能会严重损坏您的系统 从而使您的 PC 可能无法启动并且无法更新 使用 Dism exe 手动删使用

    2026年3月16日
    2
  • SSL协议分析「建议收藏」

    SSL协议分析「建议收藏」SecureSocketsLayerSSL协议概述SSL解决的问题(功能)协议的使用SSL在协议栈的位置SSL协议的分层模型SSL体系结构SSL的两个重要概念主要工作流程SSL握手协议的握手过程SSL记录层的功能SSL协议脆弱性分析SSL协议概述SecureSocketsLayer安全套接字协议SSL协议可用于保护正常运行于TCP之上的任何应用协议,如HTTP、FTP、SMTP或Telnet的通信,最常见的是用SSL来保护HTTP的通信。SSL协议的优点在于它是与应用层协议无关的。

    2022年6月2日
    68
  • μC/OS之OSTaskCreate()[通俗易懂]

    μC/OS之OSTaskCreate()[通俗易懂]转自 http://blog.csdn.net/xiaocaichonga/article/details/7449409建立任务OSTaskCreate()1.OSTaskCreate()函数的声明  INT8UOSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio)   1.1返

    2025年9月22日
    8
  • HTML5简介

    HTML5简介HTML5是HTML的最新修订标准。2014年10月29日,万维网联盟(W3C)宣布,经过8年的努力,HTML5标准规范制定完成。HTML5的设计目的是在移动设备上使用多媒体。HT

    2021年12月27日
    64
  • Tez 简介

    Tez 简介Tez 本地模式是一种测试 Tez 作业的开发工具 不需要启动 Hadoop 集群 本地模式运行 Tez 组件 AppMaster TaskRunner 这些组件在集群上执行作业时使用 从开发人员工具的角度来看 它提供了几个优点 快速原型 Hadoop 设置 启动成本等不涉及 单元测试快速执行 因为分配资源 启动 jvm 等的开销被消除了 易于调试的单个 JVM 运行所有用户代码 虽然大多数组件在本地模式下重用 但也有一些组件不是调度和容器重用是不同的 yarn 本地资源的处理 本地模

    2026年3月18日
    2

发表回复

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

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