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的区别:
阻塞算法可能会出现整个系统都挂起的情况(占有锁的线程被中断,无法释放所,那么所有试图争用这个锁的线程会被挂起),系统中的所有线程全部饿死。
无锁算法可以保证系统中至少有一个线程处于工作状态,但是还是可能有线程永远抢不到资源而被饿死。
无等待算法保证系统中的所有线程都能处于工作状态,没有线程会被饿死,只要时间够,所有线程都能结束。相比于无锁算法,无等待算法有更强的保证。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/161714.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • mfc调用cmd执行完保留黑框

    mfc调用cmd执行完保留黑框

    2021年11月20日
  • Excel 宏编程的常用代码

    Excel 宏编程的常用代码Excel宏编程的常用代码我们常用Excel统计一些数据,如果善用VBA,就能自动做出各种复杂的报表,懒人就是追求一劳永逸!不过,也不是真懒啦,只是用智慧(脑力劳动)将自身从体力劳动中解放出来而已,人类也是这样进步的。我有这样的感觉,就是每见到一个语句或函数,都会激发出偷懒的灵感来,哈哈,很自恋了,其实好玩而已。————————-

  • ?条件运算符的结合——从右往左[通俗易懂]

    ?条件运算符的结合——从右往左[通俗易懂]#include<stdio.h>#include<stdlib.h>intmain(){ intmax=1; inti=11,j=13,k=5; max=i>j?i>k?i:k:j>k?j:k; printf(“max=%d\n”,max); return0;}…

  • ps2无线手柄连接arduino的使用方法

    ps2无线手柄连接arduino的使用方法首先在https://github.com/madsci1016/Arduino-PS2X这里下载ps2x的库文件。将PS2X_lib放到库文件目录下。接线方法如下,代码部分#definepressurestrue的意思是让上下左右的按键可以度数,按下时analogRead值为255.#definerumbletrue的意思是开启震动…

  • 嵌套评论的数据库表设计

    嵌套评论的数据库表设计

  • webstorm必装十大插件_vscode webpack

    webstorm必装十大插件_vscode webpack前言作为一个FE开发者,在日常工作中用的最多的可能就是WebStorm与VsCode,我在工作的这几年一直使用的是WebStorm进行开发,今天为大家带来我工作中使用的一些Webstorm插件以及一些可以提效的配置方法,希望能够帮助使用WebStorm的朋友们更加高效工作,多余时间可以多摸摸????!最终效果展示插件推荐下面会详细介绍每一个插件的安装、使用建议,推荐指数✨.ignore:版本管理工具的忽略文件插件插件描述:支持创建多种.ignore文件,会默认设置到需要忽略的文件

发表回复

您的电子邮箱地址不会被公开。

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