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++11中condition_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++11中lock_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++11中std condition variable的使用
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
C++11中std 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 <<