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


相关推荐

  • java ac自动机_ac自动机java版

    【实例简介】从别的共享资源下载的java版ac自动机,已验证使用非常好。【实例截图】【核心代码】ahocorasick_java-1.1└──ahocorasick_java-1.1├──ahocorasick│├──pom.xml│├──src││└──main││└──java││└──org││…

    2022年4月7日
    52
  • CPU重要参数_cpu性能参数指标有哪些

    CPU重要参数_cpu性能参数指标有哪些内容来自http://www.360doc.com/content/18/1124/15/60810319_796935567.shtmlCPU有几个重要的参数:主频、核心、线程、缓存、架构。那么他

    2022年8月2日
    11
  • websocket大文件发送(分片传送思想)

    websocket大文件发送(分片传送思想)目前的项目是在做一款带桌面共享的代码编辑器,其中需要一个发送大文件的功能,传统的node.js处理大文件就是用Buffer.slice(0.offset)的思路把文件分割开,然后通过tcp或udp分开发送。前端中处理二进制的有Blob,它也有slice的方法,也可以将文件拆分开。然后借助websocket发开发送,然后在客户端(注意不是服务端)将文件合并。有人说websocket可以直接发,但是他的大小受到限制,比如发200M的东西,就会出问题。而我的方案就不会存在问题.最主要的是在发送文件的同时也不会影响

    2022年7月11日
    81
  • python安装步骤(pycharm运行python)

    文章目录一。pycharm下载安装二。python下载安装三.pycharm上配置python一。pycharm下载安装pycharm下载地址:http://www.jetbrains.com/pycharm/download/#section=windows下载详细步骤:1-2-3-4-5-67-8-直接finish二。python下载安装9-python官网:https://www.python.org/进去网址后点击:1011-下载好后12

    2022年4月10日
    157
  • Redis客户端中文乱码[通俗易懂]

    Redis客户端中文乱码[通俗易懂]Redis客户端中文乱码$redis-cliredis127.0.0.1:6379&gt;set’name”中文’OKredis127.0.0.1:6379&gt;get’name’"\xd6\xd0\xce\xc4"redis127.0.0.1:6379&gt;客户端查看乱码,这个情况我们只要将修改客户端命令行就可以。redis-cli –raw$r…

    2022年5月7日
    231
  • webstorm 2021激活码_通用破解码

    webstorm 2021激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    202

发表回复

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

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