1. 程式人生 > >c++11中訊號量例項

c++11中訊號量例項

      C++11的新特性中,一些封裝的庫使得開發人員更加方便,比如thread,mutex等這些都是Linux常用的庫,而關於semaphore訊號量相關的封裝,卻沒有做到。然而我們可以利用互斥量和條件變數來進行訊號量的封裝。

    在Linux平臺下,對於訊號量的介紹,通常會提到P/V操作,它們是訊號量的基礎,它們的概念分別如下。

P操作 (wait操作):count 減1;如果 count < 0 那麼掛起執行執行緒;

V操作 (signal操作):count 加1;如果 count <= 0 那麼喚醒一個執行執行緒;

    而本次在C++11中對訊號量的封裝,P操作被定義為成員函式wait(),V操作被定義為signal(),通過建立物件的方法,建立、初始化訊號量,而sem_init()操作已在建立訊號量物件中執行,具體看例項。

    下面是一個簡單的例項,供大家參考。新建兩個執行緒,分別執行func1、func2兩個函式,func1函式實現對全域性變數num的減1操作,func2函式則打印出全域性變數num的值。我們通過訊號量的方法,做到每次num數值減1時,列印輸出一次,實現對兩個函式func1、func2的同步操作。

程式碼如下:

class semaphore {
public:
	semaphore(int value = 1) : count{ value } {}

	void wait() {
		std::unique_lock lock{ mutex };
		if (--count<0) // count is not enough ?
			condition.wait(lock); // suspend and wait...
	}
	void signal() {
		std::lock_guard lock{ mutex };
		if (++count <= 0) // have some thread suspended ?
			condition.notify_one(); // notify one !
	}

private:
	int count;
	std::mutex mutex;
	std::condition_variable condition;
};#define _CRT_SECURE_NO_WARNINGS    //VS2013 VS2015需要加上此行,去除安全檢查
#include 
#include 
#include 
#include 
#include 
#include "sem.h"

int num = 10;
semaphore sem1(0);//相當於Linux下sem_init(&sem1,0,0);
semaphore sem2(1);//相當於Linux下sem_init(&sem2,0,1);

void func1()
{
	printf("func1() begin!\n");
	while (1)
	{
		if (num > 0)
		{
			sem1.wait();//阻塞,等待sem1.signal();執行後才會返回
			num--;
			sem2.signal();
		
		}
		else
		{
			printf("func1() return \n");
			return;
		}
	}
}

void func2()
{
	printf("func2() begin!\n");
	while (1)
	{
		if (num > 0)
		{
			sem2.wait();//阻塞,等待sem2.signal();執行後才會返回
			printf("num is %d\n", num);
			Sleep(1000);//休眠1000ms,效果更明顯
			sem1.signal();
		}
		else
		{
			printf("func2() return \n");
			return;
		}

	}
}

相關推薦

c++11訊號例項

      C++11的新特性中,一些封裝的庫使得開發人員更加方便,比如thread,mutex等這些都是Linux常用的庫,而關於semaphore訊號量相關的封裝,卻沒有做到。然而我們可以利用互

C++11實現訊號

由於C++11 和 Boost.Thread 都沒有提供訊號量,但是對於這個簡單的東西,有時候使用就是太簡單,但是為什麼沒有,可能他們覺得是這個東西太容易出錯了,所以自己實現也不是很複雜。 直接上程式碼: #include <condition_variable> #inc

c++11condition_variable訊號的標準用法。

目標:主執行緒向其它執行緒發生訊息,其它執行緒收到訊息並處理。 虛擬碼目標:主執行緒將訊息加入listTemp連結串列,使用condition_variable的notify_one通知執行緒,其它執行緒將訊息處理,並將訊息加入到已處理listTemp2連結串列中。  虛擬

linux的程序通訊:訊號例項C語言)

 這篇發的很糾結,這不是我原創的程式碼,是同學寫的,我只是想在這記錄下來,以後沒事可以看看,寫轉載嘛,又沒有轉載的來源,翻譯就更扯了,勉強寫個原創,其實不是我原創啦。 ( ̄▽ ̄)" 有興趣可以看下,這是關於linux中的訊號量的使用的一篇文章。我加了一些註釋。 題目是:寫一個程式,該程式建立兩個程序,分

C++11智能指針的原理、使用、實現

his animal something include expire another .cn 表現 oid 目錄 理解智能指針的原理 智能指針的使用 智能指針的設計和實現 1.智能指針的作用 C++程序設計中使用堆內存是非

C++11多線程庫

標準 value 生命周期 通過 死鎖 strong () 四種 ... 一、linux 線程同步 線程是在操作系統層面支持的,所以多線程的學習建議還是先找一本linux系統編程類的書,了解linux提供多線程的API。完全完全使用系統調用編寫多線程程序是痛苦,現

C++11對容器的各種循環遍歷的效率比較

ets normal pre unsigned int qdebug tex contain string 1 #include "CycleTimeTst.h" 2 #include <string> 3 #include <vector&

C++11lock_guard和unique_lock的區別

target san color member uri display each for clas c++11中有一個區域鎖lock_guard,還有第二個區域鎖unique_lock。 區域鎖lock_guard使用起來比較簡單,除了構造函數外沒有其他member fu

C++11的技術剖析( std bind原理簡單圖解)

簡化 靜態成員函數 div 語法 con mar clear 函數 多余 此文為轉載,好像原出處的原文已經無法打開了。 本文解釋了bind 是如何工作的。為了清晰,我對圖中的語法作了一些簡化(例如,省略函數調用操作符的參數類型),並且簡化了 bind 的實現. bin

C++11如何輸出enum class的值

gic log its may aps cti return cout cast Unlike an unscoped enumeration, a scoped enumeration is not implicitly convertible to its intege

C語言、全局變與變的作用域

www. 但是 表達 之間 範圍 htm target 因此 變量名 什麽是變量: 變量常量都是表征數據的一種形式;常量用來表示數據的值; 變量不僅可以用來表示數據的值;還可以用來存放數據;因為變量對應著一定的內存單元; 變量和常量必須先定義後使用。 變量名和常量名都是一種

C語言名及函數名的命名規則與駝峰命名法

char 都是 this 表示 介紹 程序設計 代碼 必須 不同的 一、C語言變量名的命名規則:(可以字母,數字,下劃線混合使用) 1. 只能以字母或下劃線開始;2. 不能以數字開始;3. 一般小寫;4. 關鍵字不允許用(eg:int float=2//error fl

程序間通訊 記憶體共享訊號例項理解

申請記憶體: int shmget(key_t key, size_t size, int shmflg); 其中key為鑰匙,兩程序通過同一個鑰匙找到核心中的共享記憶體,可通過 key_t ftok(const char *pathname, int proj_id)

C++11std condition variable的使用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++11std move的使用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

c-linux-IPC-訊號semaphore-學習

###概念### 場景:某個執行緒(程序)能從訊號拿到鎖,則執行,否則阻塞等待。 訊號量:可以理解為訊號集中某個訊號當前鎖的數值                  正值:尚可接受的程序數  

C++11的併發

在 C++98 的時代,C++標準並沒有包含多執行緒的支援,人們只能直接呼叫作業系統提供的 SDK API 來編寫多執行緒程式,不同的作業系統提供的 SDK API 以及執行緒控制能力不盡相同。到了 C++11,終於在標準之中加入了正式的多執行緒的支援,從而我們可以使用標準形式的類來建立與執行執行緒,也使得我

C++11的並發

type類 ise 動作 tex args 內部存儲 swa unlock 再次 在 C++98 的時代,C++標準並沒有包含多線程的支持,人們只能直接調用操作系統提供的 SDK API 來編寫多線程程序,不同的操作系統提供的 SDK API 以及線程控制能力不盡相同。到了

c++ 11 顯式預設設定的函式和已刪除的函式 總結

今天在一個類中看到如下程式碼不是很懂,原來是c++11 新特性 RateTimer(const RateTimer&) = delete; //不可拷貝/不可賦值 RateTimer& operator=(const RateTimer&) = delete;

C++11 chrono庫 實現高精度定時

一種“傳統”ctime計時方法: #include <ctime> using namespace std; clock_t start = clock(); // do something... clock_t end   = clock(); cout <<