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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 2021年安全生产模拟考试(全国特种作业操作证电工作业-电力电缆模拟考试题库二)安考星

    2021年安全生产模拟考试(全国特种作业操作证电工作业-电力电缆模拟考试题库二)安考星电工作业–电力电缆该模拟题库适用于全国特种作业操作证电工作业–电力电缆模拟考试题通用部分,了解更多工种完整题库信息,百度搜索【安考星】或关注“安考星”微信公众号,支持电脑及手机多端同步练习。判断题181、测温光纤全线贯通,单点损耗小于0.02dB。()√182、冷缩式终端一般用于35kV及以下交联聚乙烯绝缘电缆。()×183、电缆绝缘层的利用系数是指绝缘层中最小电场强度与最大电场强度之比。()×184、电缆终端绝缘套管进行水冲洗时,要求冲洗用水的电阻不小于1500Ωm。()√

    2022年5月7日
    103
  • HttpClient4.X发送带参数的POST请求「建议收藏」

    HttpClient4.X发送带参数的POST请求「建议收藏」HttpClient是apache组织下面的一个用于处理HTTP请求和响应的开源工具。所用jar包为httpclient-4.3.6.jar、httpcore-4.3.3.jar、httpmime-4.3.6.jar、commons-codec-1.6.jar。发送Post请求代码如下:packagecom.zkn.newlearn.httpclient;importjava

    2022年7月22日
    11
  • https和http有什么区别

    https和http有什么区别

    2021年10月9日
    46
  • PHP学习之一晚撸下W3chscool

    PHP学习之一晚撸下W3chscoolPHP多维数组其实简单的而言,多维数组就是由单个的数组组成的,两个数组嵌套组成一个二维数组,三个顾名思义就是三维数组。先来一个简单的数组。数字是key,引号里的是value<?php$array=array(‘1’=>”咋”,’2’=>”日”);echo$array[2];?>输出:日然后再来几个有难…

    2022年8月22日
    5
  • c语言数组详解(初学者这一篇就够了,看了不会打我)「建议收藏」

    c语言数组详解(初学者这一篇就够了,看了不会打我)「建议收藏」C语言数组详解1.数组:储存数据类型相同的一系列元素例如inta[100];在这里a数组储存100个int型元素,在这里[]这个符号就是告诉计算机a是一个数组。值得一提的是数组的下标访问数组的,数组中的a[0]一般表示你初始化的第一个值。2.初始化数组前面介绍过了,数组可以储存数据类型相同的一系列元素,所以初始化数组必不可少的一步就是告诉计算机这个数组储存的数据类型!…

    2022年7月11日
    21
  • 阿里云ECS遭挖矿程序攻击解决方法(彻底清除挖矿程序,顺便下载了挖矿程序的脚本)

    阿里云ECS遭挖矿程序攻击解决方法(彻底清除挖矿程序,顺便下载了挖矿程序的脚本)一:杀死挖矿程序进程在服务器上使用top指令查看cpu的使用情况,发现有一个叫java的程序占用cpu高达99.9%PIDUSERPRNIVIRTRESSHRS%CPU%MEMTIME+COMMAND5778root200…

    2022年6月17日
    36

发表回复

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

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