【Linux】使用<信號量>實現(xiàn)<線程互斥>——(解析:用信號量實現(xiàn)兩個線程互斥輸出1-10數(shù)字)

【Linux】使用<信號量>實現(xiàn)<線程互斥>——(解析:用信號量實現(xiàn)兩個線程互斥輸出1-10數(shù)字)

一.信號量的概念與語法

1.信號量基本概念、類型與頭文件

整型信號量:信號量的值為整數(shù),用于表示任意數(shù)量的資源。

記錄型信號量:除了包含一個整數(shù)值(表示可用資源的數(shù)量)外,還包含一個進程等待隊列,用于存儲阻塞在該信號量的各個進程的標(biāo)識。

二進制信號量:僅允許信號量取0或1值。這種信號量通常用于實現(xiàn)互斥鎖,保證只有一個進程或線程可以訪問共享資源。

sem_t類型:是POSIX線程庫提供的一個信號量類型。sem_t類型的信號量可以模擬上述三類分類中的某些行為。

sem_t s; // 先定義,后面再初始化
semaphore.h

信號量:表示可用資源的數(shù)量。當(dāng)進程或線程需要訪問某個共享資源時,會先嘗試獲取信號量。如果信號量的值大于0,表示有資源可用,進程或線程可以獲取信號量并訪問資源,同時信號量的值會減1。如果信號量的值為0,表示沒有資源可用,此時進程或線程會進入阻塞狀態(tài),等待其他進程或線程釋放信號量。

2.信號量的基本操作(等待P操作與釋放V操作)

等待(P操作):【Park】 進程或線程嘗試獲取信號量。如果信號量的值大于0,則獲取成功,信號量的值減1;如果信號量的值為0,則進程或線程進入阻塞狀態(tài),等待其他進程或線程釋放信號量。

釋放(V操作):【Voke】 進程或線程釋放之前獲取的信號量。釋放信號量時,該信號量的值會增加1。如果有進程或線程因為信號量的值為0而處于阻塞狀態(tài),此時會喚醒一個或多個阻塞的進程或線程。

3.信號量的基本函數(shù)(創(chuàng)建、銷毀、等待P操作與釋放V操作)

sem_init(&信號量, 0, 信號量的初值); // 創(chuàng)建信號量 sem_destroy(&信號量); // 銷毀信號量 sem_wait(&信號量); // 等待P操作 sem_post(&信號量); // 釋放V操作

二.信號量實現(xiàn)線程互斥(用信號量實現(xiàn)兩個線程互斥輸出1-10數(shù)字)

把信號量初始化成1,表示目前可用資源為1。進入兩個線程,其中第一個線程進入等待(P操作)后,信號量-1變成0。第二個線程進入等待(P操作)后,由于信號量變?yōu)?,進入阻塞狀態(tài)。第二個線程必須等到第一個線程執(zhí)行完程序后,進行釋放V操作,釋放信號量,信號量+1后,它才會解除阻塞狀態(tài),從而實現(xiàn)互斥操作,2個線程按照先后順序執(zhí)行。

#include <pthread.h> #include <stdio.h> #include <unistd.h> #include <semaphore.h> <p>sem_t s; // 定義信號量</p><p>void<em> fun(void</em> param) { long tnum = (long)param; int i;</p><pre class="brush:php;toolbar:false">sem_wait(&s); // 等待(P操作)park for(i=1; i<=10; i++) {     printf("Thread %ld: %dn", tnum, i);     usleep(100000); // 延遲100毫秒 } sem_post(&s); // 釋放(V操作)voke  return NULL;

}

int main() { pthread_t t1, t2;

sem_init(&s, 0, 1); // 初始化信號量為1  pthread_create(&t1, NULL, fun, (void*)1); pthread_create(&t2, NULL, fun, (void*)2);  pthread_join(t1, NULL); pthread_join(t2, NULL);  sem_destroy(&s); // 銷毀信號量  return 0;

}

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊10 分享