執行緒的訊號量與程序間通訊中使用的訊號量是一樣的,它是乙個特殊的變數。可以被增加和減少,但對其的關鍵操作訪問必須保證原子操作。如果乙個程式中有多個執行緒試圖改變乙個訊號量的值,系統將保證所有的操作都依次進行。
訊號量的函式都是以sem_開頭,執行緒中使用的基本訊號量函式有4個,在標頭檔案semaphore.h中。
該函式用於建立訊號量,其原型如下:
int sem_init(sem_t *sem, int pshared, unsigned int value);
(1) sem為要初始化的訊號量指標。
(3)value為訊號量的初始值。
該函式的原型如下:
int sem_post(sem_t *sem);
(1)該函式用於以原子操作的方式將訊號量加1,並且會丟擲訊號,原本被阻塞的sem_wait將被開啟。
(2)呼叫成功返回0,失敗返回-1,並且設定error
該函式的原型如下:
int sem_wait(sem_t *sem);
(1)該函式用於以原子操作的方式將訊號量加-1,等待sem_post丟擲訊號來,否則一直阻塞。
(2)呼叫成功返回0,失敗返回-1,並且設定error
該函式原型如下:
int sem_destroy(sem_t *sem);
(1)該函式對用完的訊號量清理
(2)呼叫成功返回0,失敗返回-1,並且設定error
用多執行緒實現輸入乙個非「end」的字串,並且算出字串的長度,輸入「end」時則結束程式,要求用主線程實現輸入並檢查字串是否為「end」,建立的新執行緒用來計算字串的長度。
#include #include #include #include #include char buf[100] = ;
sem_t sem;
int flag = 0;
void *func(void *ar**)
}pthread_exit(null);
}int main(void)
/*初始化執行緒間同步的訊號量*/
if(sem_init(&sem,0,0))
printf("請輸入乙個非\"end\"的字串\n");
while(scanf("%s",buf))
sem_post(&sem);//喚醒正在等待的所有執行緒
}/***子執行緒*/
if(pthread_join(th,null))
else
/***sem訊號量*/
sem_destroy(&sem);
return 0;
}
root@ubuntu:/home/yong/c_c++/2019/9.9#
root@ubuntu:/home/yong/c_c++/2019/9.9# ./a.out
請輸入乙個非"end"的字串
dwed
輸入的字串長度為4
請輸入乙個非"end"的字串
fef輸入的字串長度為3
請輸入乙個非"end"的字串
efewf
輸入的字串長度為5
請輸入乙個非"end"的字串
fwew
輸入的字串長度為4
請輸入乙個非"end"的字串
end子執行緒**成功
root@ubuntu:/home/yong/c_c++/2019/9.9#
互斥鎖簡單的可以認為是一種特殊的訊號量,它的值只能是0和1,也就是上鎖和解鎖兩種狀態。
它們都在標頭檔案pthread.h中,檔案要加上#include
該函式的原型是:
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
(1)mutex指向要初始化的互斥鎖物件
(2)attr位互斥屬性,用null表示該屬性預設
(3)成功則返回0;失敗則設定error
該函式原型是:
int pthread_mutex_lock(ptread_mutex_t *mutex);
(1)mutex是互斥物件指標
(2)成功返回0,失敗則設定error
(3)設定上鎖,對於另外乙個pthread_mutex_lock()函式則表示阻塞
(1)mutex是互斥物件指標
(2)成功返回0,失敗則設定error
(3)設定解鎖,解開pthread_mutex_lock()的鎖
(1)mutex是互斥物件指標
(2)成功返回0,失敗則設定error
(3)銷毀乙個互斥鎖
#include #include #include #include #include char buf[100] = ;
int flag = 0;
pthread_mutex_t mutex;
void *func(void *ar**)
pthread_mutex_unlock(&mutex);
sleep(1);
}}int main(void)
/*初始化執行緒間互斥鎖*/
if(pthread_mutex_init(&mutex,null))
printf("請輸入乙個非\"end\"的字串\n");
while(1)
pthread_mutex_unlock(&mutex);//解鎖
sleep(1);//讓子執行緒先執行
}/***子執行緒*/
if(pthread_join(th,null))
else
/*銷毀互斥鎖*/
if(pthread_mutex_destroy(&mutex))
return 0;
}
執行結果
root@ubuntu:/home/yong/c_c++/2019/9.9# ./a.out
請輸入乙個非"end"的字串
wdew
輸入的字串長度為4
請輸入乙個非"end"的字串
refregerg
輸入的字串長度為9
請輸入乙個非"end"的字串
regerg
輸入的字串長度為6
請輸入乙個非"end"的字串
reger
輸入的字串長度為5
請輸入乙個非"end"的字串
ergerg
輸入的字串長度為6
請輸入乙個非"end"的字串
end子執行緒**成功
root@ubuntu:/home/yong/c_c++/2019/9.9#
linux 多執行緒程式設計 訊號量的使用
訊號是e.w.dijkstra在二十世紀六十年代末設計的一種程式設計架構。dijkstra的模型與鐵路操作有關 假設某段鐵路是單線的,因此一次只允許一列火車通過。訊號將用於同步通過該軌道的火車。火車在進入單一軌道之前必須等待訊號燈變為允許通行的狀態。火車進入軌道後,會改變訊號狀態,防止其他火車進入該...
linux 多執行緒程式設計的訊號問題
最近,複習unix高階環境程式設計,當涉及到多執行緒程式設計的時候,對多執行緒環境下的訊號的處理目前存在很多疑惑。其中之一,多執行緒環境下的訊號處理必須使用多執行緒環境下pthread提供的介面,對訊號進行遮蔽以及等待。若要在多執行緒下對訊號進行阻塞的話,必須使用pthread sigmask 對訊...
Linux多執行緒程式設計 訊號量
1.1訊號量簡介 linux下主要分為兩種訊號量,system v和posix訊號量,posix訊號量又分為無名訊號量和有名訊號量,這裡我們只分享無名訊號量這裡我們主要研究posix訊號量。訊號量是同步的一種方式,常常用於對共享資源的訪問,舉乙個常見的例子,假如乙個停車場有100個停車位,我們將車停...