線程間的同步與互斥—信號量
線程間的同步與互斥—信號量
之前的博客有學習過關于進程間通信的信號量,那關于線程之間的同步和互斥的信號量是怎么理解的呢?
線程之間的Mutex變量是非0即1的,可以看作是一種資源的計數器,初始化時Mutex是1,表示有一個可用資源,加鎖的時候表示獲得該資源,將Mutex減1,置為0,表示此時沒有可用資源,解鎖的時候在重新釋放該資源,將Mutex重新加到1,表示此時又有了一個資源。關于信號量的基礎概念在這里就不多講了,詳情請參看我的另外一篇微博:點擊打開鏈接
關于線程之間的同步和互斥的信號量,我們有專門的命名:semaphore
semaphore變量的類型為sem_t,關于semaphore也有相關的一套調用接口:
頭文件:#include<semaphore.h>
初始化:int sem_init(sem_t* sem,int pshared,unsigned int value)
sem:要初始化的信號量 pshared:設置是否共享 value:信號量的初始值
P操作:int sem_wait(sem_t* sem) int sem_trywait(sem_t* sem)
V操作:int sem_post(sem_t* sem)
銷毀:int sem_destroy(sem_t* sem)
我們用一段代碼來深入理解一下以上的信號量的概念,現在我們使用循環隊列模擬生產者和消費者,其中信號量我們采用多元
信號量,將循環隊列當作我們的臨界資源,原理圖:
代碼:
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define N 64
int ring[N];
sem_t blank_sem;
sem_t data_sem;
void* product(void* arg)
{
int step = 0;
int i=0;
while(1){
int data = i;
sem_wait(&blank_sem);
ring[step] = data;
sem_post(&data_sem);
printf("product done:%d\n",data);
step++;
i++;
step %=N;
}
}
void* consumer(void*arg)
{
int step = 0;
while(1){
int data = -1;
sem_wait(&data_sem);
data = ring[step];
sem_post(&blank_sem);
printf("consumer done:%d\n",data);
step++;
step %= N;
sleep(1);
}
}
int main()
{
pthread_t c,p;
sem_init(&blank_sem,0,64);
sem_init(&data_sem, 0, 0);
pthread_create(&p,NULL,product,NULL);
pthread_create(&c,NULL,consumer,NULL);
pthread_join(p,NULL);
pthread_join(c,NULL);
sem_destroy(&blank_sem);
sem_destroy(&data_sem);
return 0;
}
是0到63,然后消費者在從空間里面拿數據,第一次拿一個1,然后生產者在生產一個64,放到循環隊列的末尾,然后
一次循環。
這樣,我們基于線程間同步與互斥的信號量的生產者和消費者的模型就完成了,有關信號量的接口,也學習完成。
限于筆者水平,文章難免有缺漏之處,歡迎指正~!
如需轉在請注明出處。
智能推薦
線程的互斥和同步(6)- Qt的信號量QSemaphore
上一篇文章主要介紹了使用Windows API創建和使用信號量Semaphore 線程的互斥和同步(5)- Windows的信號量Semaphore 本篇文章只要介紹Qt的信號量 QSemaphore 類的使用,并用一個 生產者-消費者 實例來說明信號量是如何提高多線程的效率的。 下面是使用類 QSemaphore 常用的函數: void acquire (int n = 1); 表示請求n個資源...
線程的同步控制---信號量、互斥鎖、條件變量
一、線程同步 原因:線程之間擁有許多共享資源,當此資源被多個線程進行訪問時容易造成數據錯誤,程序崩潰,所以需要對線程的臨界資源進行同步控制。 同步:多進程和多線程訪問臨界資源時,需要進行同步控制。多線程或者多進程的執行并不會完全的并行運行,有可能主線程需要等待函數線程的某些條件的發生。 多線程之間臨界資源: 全局數據 堆區數據文件描述符 線程之間的同步控制方式: 3.1信號量 #include&l...
Qt 信號量的線程同步
信號量( Semaphore ) 是另一種限制對共享資源進行訪問的線程同步機制,它與互斥量 Mutex 相似,但是有區別 。一個互斥量只 能被鎖定一次,而信號量可 以多次使用 。信號量通常用來保護一定數量的相同的資源,如數據采集時的雙緩沖區 。 QSemaphore 是實現信號量功能的類,它...
linux學習---線程同步(互斥量,信號量,條件量)線程屬性
進程 系統中程序執行和資源分配的基本單位 每個進程有自己的數據段、代碼段和堆棧段 在進行切換時需要有比較復雜的上下文切換 線程 減少處理機的空轉時間,支持多處理器以及減少上下文切換開銷, 比創建進程小很多 進程內獨立的一條運行路線 處理器調度的最小單元,也稱為輕量級進程 可以對進程的內存空間和資源進行訪問,并與同一進程中...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...