首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Golang语言社区

    go 队列

    队列适用场景:      两个线程之间的交互数据, 一个线程生产数据, 另外一个线程消费数据,效率高 缺点:需要使用固定分配的空间,不能动态增加/减少长度,存在空间浪费和无法扩展空间问题 package fmt.Println("PopError") } time.Sleep(1e9) } } //实现环形队列

    2.6K100发布于 2018-03-27
  • 队列实现

    开发过程中,对于多线程多进程的并发和并行的几乎是编程不可避免的事情,特别在涉及对于数据进行修改或者添加的时候。这个时候就需要的出现,有多种类型,互斥,自旋队列实现下边是一个队列一个简单类的实现。 struct qnode<ElemType> *t = _tail; t->next = p; _tail = p;}void push2(const ElemType &e) //考虑并发的添加操作 } e = np->_data; _head->next = np->next; delete np; return true;}bool pop2(ElemType &e){ //并发移除队列 while(_head){ tmp = _head->next;printf("_head:%p\n", _head); delete _head;_head = tmp; }}};上述队列的实现比较常见

    52610编辑于 2024-06-01
  • 来自专栏LINUX阅码场

    队列的实现

    关于队列的实现,网上有很多文章,虽然本文可能和那些文章有所重复,但是我还是想以我自己的方式把这些文章中的重要的知识点串起来和大家讲一讲这个技术。下面开始正文。 目录 关于CAS等原子操作 队列的链表实现 CAS的ABA问题 解决ABA的问题 用数组实现队列 小结 关于CAS等原子操作 ? 用数组实现队列 本实现来自论文《Implementing Lock-Free Queues》 使用数组来实现队列是很常见的方法,因为没有内存的分部和释放,一切都会变得简单,实现的思路如下: 1)数组队列应该是一个 4)EnQueue操作。假设数据x要入队列,定位TAIL的位置,使用double-CAS方法把(TAIL, EMPTY) 更新成 (x, TAIL)。 小结 以上基本上就是所有的队列的技术细节,这些技术都可以用在其它的数据结构上。 1)队列主要是通过CAS、FAA这些原子操作,和Retry-Loop实现。

    4.1K22发布于 2020-09-27
  • 来自专栏

    队列的实现

    是高性能程序的杀手,但是为了保证数据的一致性,在多线程的应用环境下又不得不加锁。但是在某些特殊的场景下, 是可以通过优化数据结构来达到的目的。那么我们就来看一下如何实现一个队列队列:众所周知,就是先进先出。 出队列的时候从队列头取出一个结点;入队列的时候,将结点添加到队列尾部。当多线程同时操作一个队列读写时,显然就需要加锁。 但是在单读单写的这种多线程应用时,是可以做到的。 这样在队列非空的情况下,front结点与tear结点中间至少间隔一个结点。 可见,加锁版本所耗时间,差不多为版本的1.5倍以上。

    1.6K60发布于 2018-01-17
  • 来自专栏CBeann的博客

    java实现队列

    写作目的 说到,其实就是用cas,不过我在百度上搜java实现队列的文章其实不多,所以自己用cas和volatile实现一下,线程安全那是必须的。 队列 package untils; import java.lang.reflect.Field; import java.util.concurrent.atomic.AtomicInteger 比如此时此刻 队列里有2个元素A和B。现在2个线程按照下面的顺序执行,其实理论上出队顺序是没有问题的,只不过后面的先打印了,给了一种先出队的错觉。 收获 其实JAVA 队列/栈_meiyongdesan的博客-CSDN博客 这个里面使用AtomicReference实现的,主要想用他的cas;但是我感觉有些绕,所以就自己用unsafe类实现cas 参考 JAVA 队列/栈_meiyongdesan的博客-CSDN博客 说说Java的Unsafe类 - 简书 关于通过Unsafe.getUnsafe()方法拿Unsafe对象抛出SecurityException

    48310编辑于 2023-12-25
  • 来自专栏全栈程序员必看

    C++编程资料,队列

    好像有人改进了一下设计, 参加文章 “Cache优化的并发队列” http://www.docin.com/p-30332640.html ,这论文里面 “Fastforward for efficient EWOULDBLOCK; 5 } 6 buffer[tail] = NULL; 7 tail = NEXT(tail); 8 return 0; 9 2, Michael &Scott 队列 “钱立兵 陈波 晏涛 徐云 孟金涛 刘涛” 等人写的“多线程并发访问队列的算法研究” http://www.siat.ac.cn/xscbw/xsqk/200906/W020091127490148897561 ACM Transactions on Computer Systems, Vol.23, No.2, May 2005 ———————- 4. libcds库提到的其他结构stack 和Split-Ordered C++数据结构支持库 CDS: Concurrent Data Structures library http://libcds.sourceforge.net/ 实现了很多无的stack(栈

    1.1K20编辑于 2022-08-31
  • 来自专栏后端开发技术

    释放队列的力量:探索用循环数组实现队列

    为了克服这些限制,队列应运而生。队列通过采用特殊的算法和数据结构,使多个线程可以并发地访问队列,而无需使用来保护共享资源。其中,基于循环数组的队列是一种经典的实现方式。 本文将深入探讨基于循环数组的队列的原理和优势。我们将介绍循环数组的基本概念,并解释如何通过适当的算法和技术实现性。 通过对比传统的保护队列队列,我们将揭示队列的性能提升和可伸缩性优势。此外,我们还将探讨基于循环数组的队列在实际应用中的挑战和注意事项。 我们将分享一些实际案例和经验教训,帮助读者更好地理解和应用队列。通过阅读本文,您将深入了解基于循环数组的队列的强大功能和潜力,以及如何利用它们来提升系统性能和可伸缩性。 (3)现在又有一个消费者将元素出列,队列变成空。(4)现在有一个生产者正在向队列中添加元素。它已经成功的申请了空间,但尚未完成数据拷贝。

    81700编辑于 2024-10-11
  • 来自专栏全栈程序员必看

    队列实现原理_优先队列 java

    首次接触数据结构的设计,请各位大佬多多指教~~~ CAS(Compare && Swap)原子操作 CAS是(lock free)的数据结构的基础。 false; } CAS相似的原子操作: fetch and add,一般用来对变量做+1的原子操作 test and set, 写值到内存位置并传回其旧值 test test and set : 和双检查一样为了减少对的多次竞争 ,对的竞争代价比普通判断的状态要大,这里需要着重强调,在high level programming的背景下,尽量少用双重检测的形式,因为第二次检查和设置并不一定是原子操作。 < class T > bool atomic_compare_exchange_weak( volatile std::atomic* obj, T* expected, T desired ); 队列的链表实现 用数组实现队列 队列可以用ring buffer实现,定位head和tail可以声明两个计数器,一个用来计数EnQueue的次数,一个用来计数DeQueue的次数,当队列满或空,可以抛出异常,没有内存泄露的问题

    78430编辑于 2022-11-01
  • 来自专栏全栈程序员必看

    ringbuffer 队列_wear ring

    要保存多次操作的内容就要有一个类似“队列”的东西来保存,而一般的线程安全的队列,都是“有队列”,在性能要求很高的系统中,不希望在日志记录这个地方耗费多一点计算资源,所以最好有一个“队列”,因此最佳方案就是 顾名思义,就是一个内存环,每一次读写操作都循环利用这个内存环,从而避免频繁分配和回收内存,减轻GC压力,同时由于Ring Buffer可以实现为队列,从而整体上大幅提高系统性能。 需要使用原子Interlocked。 通常情况下我们都是使用托管来解决这种并发问题,但本文的目的就是要实现一个“环形缓冲区”,不能在此“功亏一篑”,所以此时“信号量”上场了。 :Thread index:3–FFFFFFF Arr[5]:Thread index:2–FFFFFFF Arr[6]:Thread index:4–FFFFFFF Arr[7]:Thread index

    82530编辑于 2022-09-30
  • 来自专栏全栈程序员必看

    ringbuffer 队列_javabytebuffer使用

    2、概念 关于循环缓冲区(Ring Buffer)的概念,其实来自于Linux内核(Maybe),是为解决某些特殊情况下的竞争问题提供了一种免的方法。 out; spinlock_t *lock; }; 其中buffer指向存放数据的缓冲区,size是缓冲区的大小,in是写指针下标,out是读指针下标,lock是加到struct kfifo上的自旋( 上面说不加锁不是这里的),防止多个进程并发访问此数据结构。 当收到来自用户的转储数据的请求时,每个线程获得一个,并将其转储到中心位置。或者分配一个很大的全局内存块,并将其划分为较小的槽位,其中每个槽位都可由一个线程用来进行日志记录。

    1.1K10编辑于 2022-10-03
  • 来自专栏cwl_Java

    C++多线程-队列

    对于编写多线程的朋友来说,队列具有天生的互斥性。在队列里面,一个负责添加数据,一个负责处理数据。谁也不妨碍谁,谁也离不开谁。所以,队列具有天生的并行性。 [pQueue->head]; pQueue->head = (pQueue->head + 1)% MAX_NUMBER; return OK; } 总结: (1)队列只适合两个线程并行使用 ,一个压入数据,一个弹出数据 (2)队列是没有的并行,没有死锁的危险 (3)队列中head和tail只有在计算结束之前的时候才能进行自增运算

    1.3K10发布于 2020-01-15
  • 来自专栏豆包的专栏

    共享内存队列的实现

    作者:范健 导语: 共享内存队列是老调重弹了,相关的实现网上都能找到很多。但看了公司内外的很多实现,都有不少的问题,于是自己做了重新实现。 为什么需要共享内存队列? 为了便于查找定位问题,需要做一个日志收集跟踪系统,每个业务模块都需要调用SDK输出格式化的本地日志并将日志发送到远端。 又因为业务模块可能是多线程模式也可能是多进程模式,所以队列应该是在共享内存中。 简单的做法是,对队列的读写都加锁,但这样无疑会导致高并发下性能瓶颈就在这把锁上。所以我们需要队列。 看了公司内外很多版本的队列实现,多多少少都有些问题,所以自己重新实现了一个版本。 环形数组 大部分队列都是用环形数组实现的,简单高效,这里也不例外。 4 .消费者读取数据后,需要将read_index前移到合适的位置,且因为只有一个消费者,这里无需使用原子操作。 这种实现看似OK,其实也有问题。

    13.1K31发布于 2017-11-06
  • 来自专栏haifeiWu与他朋友们的专栏

    高性能队列 Disruptor 初体验

    设计 每个生产者或者消费者线程,会先申请可以操作的元素在数组中的位置,申请到之后,直接在该位置写入或者读取数据。 通过上面的介绍,我们大概可以了解到 Disruptor 是一个高性能的队列,那么该如何使用呢,下面楼主通过 Disruptor 实现一个简单的生产者消费者模型,介绍 Disruptor 的使用 首先 小结 Disruptor 通过精巧的设计实现了在高并发情形下的高性能。 另外在Log4j 2中的异步模式采用了Disruptor来处理。 在这里楼主遇到一个小问题,就是在使用Log4j 2通过 TCP 模式往 logstash 发日志数据的时候,由于网络问题导致链接中断,从而导致 Log4j 2 不停的往 ringbuffer 中写数据, 解决方案是设置 Log4j 2 中 Disruptor 队列有界,或者换成 UDP 模式来写日志数据(如果数据不重要的话)。 参考链接 剖析Disruptor:为什么会这么快?

    1.7K30发布于 2018-09-11
  • 来自专栏卯金刀GG

    高并发Java(4):

    在高并发Java(1):前言中已经提到了无的概念,由于在jdk源码中有大量的应用,所以在这里介绍下。 1 类的原理详解 1.1 CAS CAS算法的过程是这样:它包含3个参数CAS(V,E,N)。V表示要更新的变量,E表示预期值,N表示新值。 基于这样的原理,CAS 操作即时没有,也可以发现其他线程对当前线程的干扰,并进行恰当的处理。 我们会发现,CAS的步骤太多,有没有可能在判断V和E相同后,正要赋值时,切换了线程,更改了值。 Java当中提供了很多无类,下面来介绍下类。 2 无所类的使用 我们已经知道,比阻塞效率要高得多。我们来看看Java是如何实现这些类的。 2.1. 1 shift = 31 - Integer.numberOfLeadingZeros(scale); 前导零的意思就是比如8位表示12,00001100,那么前导零就是1前面的0的个数,就是4

    70420发布于 2019-07-26
  • 来自专栏Postgresql源码分析

    Postgresql中使用CAS实现队列

    概述 Postgresql中的大很多,其中ProcArrayLock和XactSLRULock使用了无队列优化(PG中XID的分发也可以用这种机制优化,高压场景下效果不错)。 Postgresql中的CAS队列逻辑总结 PG中CAS队列最简代码(所有变量为int) ProcArrayGroupClearXid ... ... sets when * equal to measure the success. */ __asm__ __volatile__( " lock \n" " cmpxchgl %4, procArrayGroupNext | procArrayGroupFirst -----> procno2 这样就通过CAS形成了一个队列 综上,就是Postgresql中使用CAS实现队列的方法。

    95630编辑于 2023-03-01
  • 来自专栏码匠的流水账

    高性能SPSC队列设计之路

    序 本文整理了Single Producer/Consumer lock free Queue step by step这篇文章里头关于高性能的SPSC队列使用遵循的四个原则: 单写原则 使用lazySet Atomic*.lazySet is a performance win for single writers 单独写原则Single Writer Principle Java性能优化要点之五: 队列

    1.2K20发布于 2018-09-17
  • 来自专栏全栈程序员必看

    c语言 编程,编程与有编程的效率总结、队列的实现(c语言)「建议收藏」

    1.编程与有编程的效率 编程,即通过CAS原子操作去控制线程的同步。如果你还不知道什么使CAS原子操作,建议先去查看相关资料,这一方面的资料网络上有很多。 CAS实现的是硬件级的互斥,在线程低并发的情况下,其性能比普通互斥高效,但是当线程高并发的时候,硬件级互斥引入的代价与应用层的竞争产生的代价同样都是很大的。这时普通编程其实是优于编程的。 2.编程的好处 编程不需要程序员再去考虑死锁、优先反转等棘手的问题,因此在对应用程序不太复杂,而对性能要求稍高的程序中,可以采取有编程。 如果程序较为复杂,性能要求不高的程序中可以使用编程。 3.队列的实现 对于线程同步方式方式的应用,我实现了一个队列。 QuePop(&data)) printf(“队列为空\n”); else printf(“队列输出元素:%d\n”,data); } } int main() { //初始化队列 QueInit(

    2.2K10编辑于 2022-08-15
  • 来自专栏产品优化

    Java 实战系列·高性能队列 Disruptor

    高性能队列 Disruptor Disruptor 是英国外汇交易公司 LMAX 开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题,因其出色的性能表现获得 2011 Duke’s 程序框架创新奖 能够在的条件下进行并行消费,也可以根据消费者之间的依赖关系进行先后消费次序。 Disruptor 高效原理: Disruptor 使用了一个 RingBuffer 替代队列,用生产者消费者指针替代。 生产者消费者指针使用 CPU 支持的整数自增,无需加锁并且速度很快。 artifactId> <version>3.4.2</version> </dependency> 命令字和数据包 /** * @author Nicestar * @description 队列命令字 disruptor: buffer: size: 1048576 /** * @author Nicestar * @description 环型队列 * @since 2020-

    1.7K20编辑于 2022-12-01
  • 来自专栏Albert陈凯

    2018-08-02 你应该知道的高性能队列Disruptor你应该知道的高性能队列Disruptor1.何为队列2.jdk中的队列3.Disruptor4.Log4j中的Disruptor最

    https://juejin.im/post/5b5f10d65188251ad06b78e3 你应该知道的高性能队列Disruptor 1.何为队列 听到队列相信大家对其并不陌生,在我们现实生活中队列随处可见 否 链表 CAS 无界 我们可以看见,我们队列是无界的,有队列是有界的,这里就会涉及到一个问题,我们在真正的线上环境中,无界的队列,对我们系统的影响比较大,有可能会导致我们内存直接溢出 当然ArrayBlockingQueue,也有自己的弊端,就是性能比较低,为什么jdk会增加一些队列,其实就是为了增加性能,很苦恼,又需要,又需要有界,这个时候恐怕会忍不住说一句你咋不上天呢? 由此我们可以知道Lock>CAS>。 而我们的Disruptor中使用的就是CAS,他利用CAS进行队列中的一些下标设置,减少了的冲突,提高了性能。 另外对于jdk中其他的队列也是使用CAS,原子类也是使用CAS。

    1K20发布于 2018-08-03
  • 来自专栏腾讯技术工程官方号的专栏

    队列的几种实现及其性能对比

    作者:juliatliu,腾讯 PCG 运营开发工程师 一、队列用在什么样的场景? 当需要处理的数据非常多,比如行情数据,一秒处理非常多的数据的时候,可以考虑用队列。 但是如果一秒只需要处理几百或者几千的数据,是没有必要考虑用队列的。用互斥就能解决问题,数据量相对少的时候互斥队列之间差别并不是很明显。 二、为什么要用队列? 有队列会有哪些问题? 三、队列的实现 3.1 一读一写的队列 yqueue 是用来设计队列,ypipe 用来设计队列的写入时机、回滚以及 flush,首先我们来看 yqueue 的设计。 ,可以看以上单读单写的队列。 在单生产者的情况下,队列战胜了阻塞队列.而随着生产者数量的增加,队列的效率迅速下降。因为在多个生产者的情况下,第 2 个 CAS 将对性能产生影响。

    8K21编辑于 2022-05-13
领券