1. 程式人生 > >併發無鎖佇列學習(單生產者單消費者模型)

併發無鎖佇列學習(單生產者單消費者模型)

1、引言
本文介紹單生產者單消費者模型的佇列。根據寫入佇列的內容是定長還是變長,分為單生產者單消費者定長佇列和單生產者單消費者變長佇列兩種。單生產者單消費者模型的佇列操作過程是不需要進行加鎖的。生產者通過寫索引控制入隊操作,消費者通過讀索引控制出佇列操作。二者相互之間對索引是獨享,不存在競爭關係。如下圖所示:
這裡寫圖片描述
2、單生產者單消費者定長佇列

  這種佇列要求每次入隊和出隊的內容是定長的,即生產者寫入佇列和消費者讀取佇列的內容大小事相同的。linux核心中的kfifo就是這種佇列,提供了讀和寫兩個索引。單生產者單消費者佇列資料結構定義如下所示:
  

typedef struct
{ uint32_t r_index; /*讀指標*/ uint32_t w_index; /*寫指標*/ uint32_t size; /*緩衝區大小*/ char *buff[0]; /*緩衝區起始地址*/ }ring_buff_st;

為了方便計算位置,設定佇列的大小為2的次冪。這樣可以將之前的取餘操作轉換為位操作,即r_index = r_index % size 與 r_index = r_index & (size -1)等價。位操作非常快,充分利用了二進位制的特徵。
(1)佇列初始狀態,讀寫索引相等,此時佇列為空。
這裡寫圖片描述
(2)寫入佇列

寫操作即進行入隊操作,入隊有三種場景,

2.1 寫索引大於等於讀索引
這裡寫圖片描述
這裡寫圖片描述
2.2寫索引小於讀索引
這裡寫圖片描述
2.3.寫索引後不夠寫入一個
這裡寫圖片描述
(3)讀取佇列

讀佇列分為三種場景

3.1寫索引大於等於讀索引
這裡寫圖片描述
3.2寫索引小於讀索引
這裡寫圖片描述
3.3.讀索引後面不夠一個
這裡寫圖片描述
3、單生產者單消費者變長佇列

  有些時候生產者每次寫入的資料長度是不確定的,導致寫入佇列的資料時變長的。這樣為了充分利用佇列,需要增加一個結束索引,保證佇列末尾至少能夠寫入一個數據。變長佇列資料結構定義如下:
  詳細見我部落格關於邊長陣列介紹

typedef struct
{
    uint32_t r_index; /*讀指標*/
    uint32_t w_index; /*寫指標*/
uint32_t e_index; /*佇列結束指標*/ uint32_t size; /*緩衝區大小*/ char *buff[0]; /*緩衝區起始地址*/ }ring_buff_st;

相關推薦

併發佇列學習生產者消費者模型

1、引言 本文介紹單生產者單消費者模型的佇列。根據寫入佇列的內容是定長還是變長,分為單生產者單消費者定長佇列和單生產者單消費者變長佇列兩種。單生產者單消費者模型的佇列操作過程是不需要進行加鎖的。生產者通過寫索引控制入隊操作,消費者通過讀索引控制出佇列操作。二者

併發佇列學習之二【生產者消費者

1、前言   最近工作比較忙,加班較多,每天晚上回到家10點多了。我不知道自己還能堅持多久,既然選擇了就要做到最好。寫部落格的少了。總覺得少了點什麼,需要繼續學習。今天繼續上個開篇寫,介紹單生產者單消費者模型的佇列。根據寫入佇列的內容是定長還是變長,分為單生產者單消費者定長佇列和單生產者單消費者變長佇列兩

併發佇列學習資料結構

提到平行計算通常都會想到加鎖,事實卻並非如此,大多數併發是不需要加鎖的。比如在不同電腦上執行的程式碼編輯器,兩者併發執行不需要加鎖。在一臺電腦上同時執行的媒體播放放器和程式碼編輯器,兩者併發執行不需要加鎖(當然系統呼叫和程序排程是要加鎖的)。在同一個程序中執行多

生產者消費者佇列實現c

根據上面連結所說的原理實現的單生產者,單消費者無鎖佇列 bool __sync_bool_compare_and_swap (type *ptr, type oldval,type newval, ...) 函式提供原子的比較和交換,如果*ptr == oldval

20181229守護程序,互斥,IPC,生產者消費者模型

    一、守護程序 守護程序:一個程序B守護另一個程序A,當被守護的程序A結束,程序B也就結束了。(不一定同生,但會同死)   兩個特點: ①守護程序會在主程序程式碼執行結束後就終止 ②守護程序內無法再開啟子程序,否則丟擲異常。 注意:程序之間是互相獨立的,主程

訊號量生產者消費者模型

訊號量和管程都是作業系統用於同步提供的兩種方法,我們將結合生產者與消費者模型對此進行學習。 什麼是訊號量? 為了提高系統的併發性,我們引入了多程序,多執行緒,但是這樣子帶來了資源競爭,也就是多個程式同時訪問一個共享資源而引發的一系列問題,因此我們需要

ROS中gazebo工具學習使用gazebo載入機器人模型

gazebo是ROS中的一個實現物理模擬的工具包,gazebo本身就是一款機器人的模擬軟體,基於ODE的物理引擎,可以模擬機器人以及環境中的很多物理特性。 注意,gazebo和rviz是不同的工具包,不要混淆。 類似於rviz工具,在gazebo工具中也可以

Python學習【第20篇】:互斥以及程序之間的三種通訊方式IPC以及生產者消費者模型 python併發程式設計之多程序1-----------互斥與程序間的通訊

python併發程式設計之多程序1-----------互斥鎖與程序間的通訊 一、互斥鎖 程序之間資料隔離,但是共享一套檔案系統,因而可以通過檔案來實現程序直接的通訊,

Python學習【第20篇】:互斥以及進程之間的三種通信方式IPC以及生產者消費者模型

數量 release value body pan sin 回收 dom 之前 python並發編程之多進程1-----------互斥鎖與進程間的通信 一、互斥鎖 進程之間數據隔離,但是共享一套文件系統,因而可以通過文件來實現進程直接的通信,但問題

c語言資料結構應用-陣列佇列佇列在多執行緒中的使用

一、背景 上篇文章《c語言資料結構實現-陣列佇列/環形佇列》講述了陣列佇列的原理與實現,本文編寫一個雙執行緒進行速度測試 二、相關知識 多執行緒程式設計介面: 1) 建立執行緒 pthread_create 函式 SYNOPSIS #include <

evpp效能測試3: 對佇列boost::lockfree::queue和moodycamel::ConcurrentQueue做一個性能對比測試

Brief 我們使用https://github.com/Qihoo360/evpp專案中的EventLoop::QueueInLoop(...)函式來做這個效能測試。我們通過該函式能夠將一個仿函式執行體從一個執行緒排程到另一個執行緒中執行。這是一個典

併發環形佇列的實現

前面在《Linux核心資料結構kfifo詳解》一文中詳細解析了 Linux  核心併發無鎖環形佇列kfifo的原理和實現,kfifo鬼斧神工,博大精深,讓人歎為觀止,但遺憾的是kfifo為核心提供服務,並未開放出來。劍不試則利鈍暗,弓不試則勁撓誣,鷹不試則巧拙惑,馬不試則良駑

python學習——day9ssh,線程和進程,信號量,隊列,生產者消費者模型 Alex地址:http://www.cnblogs.com/alex3714/articles/5230609.html

png 接口 count() day bound 共享 car 共享內存 top 一、python上模擬ssh 1.ssh,ssh_ftp pass 2.ssh 密鑰 pass 二、線程,進程 定義: 進程: 是對各種資源管理的集合,qq 要以一個整體的形式暴露給操

python全棧開發基礎【第二十一篇】互斥以及進程之間的三種通信方式IPC以及生產者消費者模型

ipc 例子 清空 ase 多個進程 art 並且 star als 一、互斥鎖 進程之間數據隔離,但是共享一套文件系統,因而可以通過文件來實現進程直接的通信,但問題是必須自己加鎖處理。 註意:加鎖的目的是為了保證多個進程修改同一塊數據時,同一時間只能有一個修改,即串行的修

使用隊列環形緩沖區註意事項

size sign until read 定義 log 消費 ucc student 環形緩沖區是生產者和消費者模型中常用的數據結構。生產者將數據放入數組的尾端,而消費者從數組的另一端移走數據,當達到數組的尾部時,生產者繞回到數組的頭部。如果只有一個生產者和一個消費者,那麽

基於陣列的佇列(譯)

原文 1 引言 最近對於注重效能的應用程式,我們有了一種能顯著提高程式效能的選擇:多執行緒.執行緒的概念實際上已經存在了很長時間.在過去,多數計算機只有一個處理器,執行緒主要用於將一個大的任務拆分成一系列更小的執行單元.以使得當其中某些執行單元因為等待資源而被阻塞的時候剩餘的執行單元能繼續執行。舉個示例,一個

lockFreeQueue 佇列實現與總結

無鎖佇列 介紹   在工程上,為了解決兩個處理器互動速度不一致的問題,我們使用佇列作為快取,生產者將資料放入佇列,消費者從佇列中取出資料。這個時候就會出現四種情況,單生產者單消費者,多生產者單消費者,單生成者多消費者,多生產者多消費者。我們知道,多執行緒往往會帶來資料不一致的情況,一般需要靠加鎖解決問題。

RabbitMQ五種訊息佇列學習--路由模式

RabbitMQ五種訊息佇列學習(五)–路由模式 標籤(空格分隔): RabbitMQ 釋出訂閱模式只是利用路由這個功能,將訊息全部分發給所有與路由繫結的佇列中,不能對不同的訊息進行選擇性的分發。 模型結構 路由根據Routing Key進行

資料結構基礎篇:原子性、原子性原語

無鎖資料結構基於兩方面——原子性操作以及記憶體訪問控制方法。本文中我話題主要涉及原子性和原子性原語。 在開始之前,我對大家表示感謝,謝謝你們對初識無鎖資料結構的熱愛。看到大家對無鎖話題很感興趣,我感到很開心。我計劃依據學術概念將此做成一個系列,從基礎到演算法,同時以

資料結構1:簡介

希望本文能成為無鎖(lock free)資料結構系列文章一個好的開端。我很樂意與社群分享我的經歷,這個系列就什麼是無鎖資料結構、如何實現以及 STL 容器概念是否適用於無鎖容器,何種情形下適合應用無鎖資料結構做一些分享。 談論無鎖資料結構,必然要談論諸如原子操作、程