1. 程式人生 > >這裡實現一個基於陣列的執行緒安全的迴圈佇列

這裡實現一個基於陣列的執行緒安全的迴圈佇列

具體程式碼如下:

#include<pthread.h>
#include<iostream>
using namespace std;

#define QUEUESIZE 128

template<class object>
class ThreadSafeQueue
{
private:
	pthread_mutex_t m_lock;
	int m_front;
	int m_rear;
	object m_data[QUEUESIZE];
public:
	ThreadSafeQueue():m_front(0),m_rear(0)
	{
		pthread_mutex_init(&m_lock,NULL);
	}
	
	bool EnQueue(object data)
	{
		pthread_mutex_lock(&m_lock);
		if(isFull())
		{
			cout<<"The queue is full!"<<endl;
			pthread_mutex_unlock(&m_lock);
			return false;
		}
		m_data[m_rear] = data;
		m_rear = (m_rear+1)%QUEUESIZE;
		pthread_mutex_unlock(&m_lock);
		return true;
	}
	
	bool DeQueue(object& data)
	{
		pthread_mutex_lock(&m_lock);
		if(isEmpty())
		{
			cout<<"The queue is empty!"<<endl;
			pthread_mutex_unlock(&m_lock);
			return false;
		}
		data = m_data[m_front];
		m_front = (m_front+1)%QUEUESIZE;
		pthread_mutex_unlock(&m_lock);
		return true;
	}
	
	bool isFull()
	{
		if((m_rear+1)%QUEUESIZE == m_front)
			return true;
		return false;
	}
	
	bool isEmpty()
	{
		if(m_rear == m_front)
			return true;
		return false;
	}
	
	~ThreadSafeQueue()
	{
		pthread_mutex_destroy(&m_lock);
	}
};



int main(int argc, char* argv[])
{
	ThreadSafeQueue<int> testQueue;
	int out = 0;
	if(!testQueue.DeQueue(out))
		cout<<"DeQueue false!"<<endl;
	else
		cout<<"DeQueue true out="<<out<<endl;
	testQueue.EnQueue(12);
	testQueue.EnQueue(13);
	testQueue.EnQueue(14);
        if(!testQueue.DeQueue(out))
                cout<<"DeQueue false!"<<endl;
        else
                cout<<"DeQueue true out="<<out<<endl;

        if(!testQueue.DeQueue(out))
                cout<<"DeQueue false!"<<endl;
        else
                cout<<"DeQueue true out="<<out<<endl;

        if(!testQueue.DeQueue(out))
                cout<<"DeQueue false!"<<endl;
        else
                cout<<"DeQueue true out="<<out<<endl;

        if(!testQueue.DeQueue(out))
                cout<<"DeQueue false!"<<endl;
        else
                cout<<"DeQueue true out="<<out<<endl;
	return 0;
}

g++ queue.c -lpthread

相關推薦

這裡實現一個基於陣列執行安全迴圈佇列

具體程式碼如下: #include<pthread.h> #include<iostream> using namespace std; #define QUEUESIZE 128 template<class object> cla

基於CAS執行安全實現計數器

 在多執行緒環境下,實現一個CAS原理的執行緒安全的技術器,並與不使用CAS演算法的計數器進行比較。 package com.feiyu.text; import java.util.ArrayList; import java.util.List; import jav

C++11:基於std::queue和std::mutex構建一個執行安全佇列

C++中的模板std::queue提供了一個佇列容器,但這個容器並不是執行緒安全的,如果在多執行緒環境下使用佇列,它是不能直接拿來用的。 基於它做一個執行緒安全的佇列也並不複雜。基本的原理就是用std::mutext訊號量對std::queue進行訪問控制,以

c/c++ 多執行 利用條件變數實現執行安全佇列

多執行緒 利用條件變數實現執行緒安全的佇列 背景:標準STL庫的佇列queue是執行緒不安全的。 利用條件變數(Condition variable)簡單實現一個執行緒安全的佇列。 程式碼: #include <queue> #include <memory> #include

執行 繼承Thread類 實現Runnable介面 多執行安全 synchronized 單例設計懶漢 鎖死

程序 是一個正在執行中的程式。 每個程序執行都有一個執行順序,該順序是一個執行路徑,或者叫一個控制單元。 舉例子:一個程序,就是一個正在執行的程式。 執行緒 就是程序中的一個獨立的控制單元。 執行緒在

Go語言實現執行安全訪問佇列

這個例子用Go語言的包"container/list"實現一個執行緒安全訪問的佇列。其中不少細節耐人尋味,做出它則是花費了不少精力,找不到樣例啊! Go語言的許多優點自不必說,然而從C/C++程式角度看,語言的語法也好,程式的實現方式也好,看起來總有點怪怪的感覺。 在這個程

C++實現執行安全佇列

  C++標準庫已經提供了std::queue這一佇列容器,但不是執行緒安全的。std::queue這個容器已經提供了pop(),push(),empty()等這些讀寫操作容器的函式,只要在這些函式上面加個鎖,就可以使其執行緒安全。   在C++原有容器上面進

用c++11寫的一個執行安全佇列

#ifndef __MSG__QUEUE__H__ #define __MSG__QUEUE__H__ #include <thread> #include <mutex>

二、執行安全阻塞佇列 BlockingQueue 入門

一、BlockingQueue繼承關係 java.util.concurrent 包裡的 BlockingQueue是一個介面, 繼承Queue介面,Queue介面繼承 Collection BlockingQueue --> Queue –-> Collection

三、執行安全阻塞佇列 BlockingQueue 詳解

轉載自: https://www.cnblogs.com/WangHaiMing/p/8798709.html 本篇將詳細介紹BlockingQueue,以下是涉及的主要內容: BlockingQueue的核心方法 阻塞佇列的成員的概要介紹 詳細介紹DelayQu

基於stl序列容器實現的通用集合類 (執行安全版)

{ 31    typedef U<T> Allocator; 32    typedef C<T,Allocator>base; 33    typedef STLCollection<T,ThreadModel,MutexPolicy,C,U> self; 34 35p

一個執行安全的計數器實現(java),可以讓一個變數每天從1開始遞增

前幾天工作中一段業務程式碼需要一個變數每天從1開始遞增。為此自己簡單的封裝了一個執行緒安全的計數器,可以讓一個變數每天從1開始遞增。當然了,如果專案在執行中發生重啟,即便日期還是當天,還是會從1開始重新計數。所以把計數器的值儲存在資料庫中會更靠譜,不過這不影響這

linux下的一個簡單執行安全記憶體池實現

這裡提供一個簡單執行緒安全記憶體池, 基於linux pthread 如下圖: 具體的資料結構: typedef struct LocMap{ char * point;

實現一個執行安全的單例模式

一、單例模式        單例模式也叫單件模式。Singleton是一個非常常用的設計模式,幾乎所有稍微大一些的程式都會使用它,所以構建一個高效的Singleton很重要。 1、單例類保證全域性只有一個唯一例項物件 2、單例類提供獲取這個唯一例項的介面。        

如何實現一個執行安全的map?

我們都知道,map是執行緒不安全的,那麼我們如何才能實現一個執行緒安全的map呢? 這裡介紹4種實現方式: 1、使用synchronized來進行約束: synchronized(obj){     value = map.get(key); } 2、使用JDK1.5版本

阿里面試官讓我實現一個執行安全並且可以設定過期時間的LRU快取,我蒙了!

目錄1. LRU 快取介紹2. ConcurrentLinkedQueue簡單介紹3. ReadWriteLock簡單介紹4.ScheduledExecutorService 簡單介紹5. 徒手擼一個執行緒安全的 LRU 快取5.1. 實現方法5.2. 原理5.3. put方法具體流程分析5.4. 原始碼6.

Qt中實現執行安全的單例模式

之前專案中用到單例模式,用的是執行緒不安全的,這次專案用到了多執行緒,所以想到實現一個執行緒安全的單例模式。經過查詢資料,發現Qt本身有自己的執行緒安全單例模式實現方式。 Q_GLOBAL_STATIC巨集 使用方法:MonitorWindow.h #ifndef MONITORW

設計模式之單例模式【內附物件例項化幾種方式、實現執行安全幾種方式】

繼續來複習常用的設計模式-單例模式,順便回憶一下執行緒安全的幾種實現方式。 一、什麼是單例模式 單例模式,簡單常用的一種設計模式,也很好的體現了程式碼控制物件在記憶體數量的一種方式,主要分2種實現方式: ①餓漢式,執行緒安全 ②懶漢式,執行緒不安全(新增鎖機制,可以實現執行緒安全)

JVM——執行安全實現方法

一互斥同步(悲觀的併發策略) 同步是指在多個執行緒併發訪問共享資料時,保證共享資料在同一時刻只被一個執行緒使用。互斥是實現同步的一種手段,下面介紹兩種互斥同步的手段:synchronized關鍵字和concurrent包中的重入鎖ReentrantLock synchronized關鍵字:

實現Runnable解決多執行資料安全問題

xl_echo編輯整理,歡迎轉載,轉載請宣告文章來源。更多IT、程式設計案例、資料請聯絡QQ:1280023003,加群298140694。百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!! 之前的文章我們講到了,四個電影院視窗同時出售50張彩票的