為什麼需要用訊號量?在posix執行緒庫(二)執行緒同步輪詢技術——一種笨笨方法 簡單的變數+延遲的方法是一種非常不聰明的方法,主要原因是普通變數不能保證原子性,同時對標誌的操作可能導致預料外的效果。荷蘭科學家dijkstra提出訊號量的概念,它是一種特殊的變數,可以被遞增遞減,當兩個或以上執行緒對這個訊號量進行改變,由系統按順序完成執行緒的請求。訊號量常用來保護一段**,保證一次只能被乙個執行緒執行。
使用乙個訊號量,其基本步驟是:
標頭檔案#include
宣告
sem_t bin_sem;
初始化int
sem_init
(sem_t *sem,
int pshared,
unsigned
int value)
;
增加、減少訊號量int
sem_post
(sem_t * sem)
;int
sem_wait
(sem_t * sem)
;
sem_wait
和sem_post
都接受乙個訊號量位址,和初始化一樣,成功0,失敗!0。值得注意的是,sem_wait
可能阻塞當前程序,阻塞的條件是,遞減後為負數,也就是訊號量為0,要想繼續執行,需要呼叫sem_post
完成訊號量遞增。
銷毀
int
sem_destory
(sem_t * sem)
;
#include
#include
#include
#include
sem_t t;
using namespace std;
void
*thfun1
(void*)
}void
*thfun2
(void*)
}using namespace std;
intmain()
列印結果如下:
abababababababababab20200802 才發現原來在ubuntu下執行的結果並沒有交錯執行的效果。而且實際使用的時候你沒有辦法預估乙個執行緒執行時間,因此需要找其他辦法。
OpenMP(三) 執行緒同步
1.引言 在openmp中,執行緒同步機制包括互斥鎖同步機制和事件同步機制。2.互斥鎖同步 互斥鎖同步的概念類似於windows中的臨界區 criticalsection 以及windows和linux中的mutex以及vxworks中的semtake和semgive 初始化時訊號量為滿 即對某一塊...
Posix多執行緒筆記(三) 執行緒屬性(2)
四 執行緒的排程策略 函式pthread attr setschedpolicy和pthread attr getschedpolicy分別用來設定和得到執行緒的排程策略。4.名稱 pthread attr getschedpolicy pthread attr setschedpolicy 功能 ...
Posix多執行緒筆記(三) 執行緒屬性(3)
六 執行緒的作用域 函式pthread attr setscope和pthread attr getscope分別用來設定和得到執行緒的作用域,這兩個函式的定義如下 7 名稱 pthread attr setscope pthread attr getscope 功能 獲得 設定執行緒的作用域 標頭...