Linux系統(tǒng)編程-(pthread)線程通信(信號量)

      網(wǎng)友投稿 1133 2025-03-31

      1. 信號量介紹

      信號量的運(yùn)用環(huán)境與互斥鎖一樣,但是信號量比互斥鎖增加靈活,互斥鎖只有兩個狀態(tài)(開鎖和解鎖),而信號量本質(zhì)上是一個計數(shù)器,它內(nèi)部有一個變量計數(shù)信號值,可以保護(hù)一個資源可以同時被1個或者2個或者3個線程同時使用,如果信號量的值只是設(shè)置1(狀態(tài)只有0和1),那么和互斥鎖就是一樣的功能。

      總結(jié)

      信號量也主要是用來保護(hù)共享資源(信號量也屬于臨界資源),使得資源在一個時刻只有一個線程或者多個線程獨(dú)享。

      信號量是一種特殊的變量,訪問具有原子性, 用于解決進(jìn)程或線程間共享資源引發(fā)的同步問題。

      信號量就是一個計數(shù)變量,內(nèi)部本身就是一個變量。只不過這個變量具有原子性。

      信號量經(jīng)常用來保護(hù)臨界區(qū)資源、實(shí)現(xiàn)資源同步。

      如果信號量只有2個值,0和1,就稱為二值信號量==互斥鎖。

      **信號量和互斥鎖(mutex)的區(qū)別:**互斥鎖只允許一個線程進(jìn)入臨界區(qū),而信號量允許多個線程同時進(jìn)入臨界區(qū),要使用信號量同步,需要包含頭文件semaphore.h。

      2. 信號量實(shí)現(xiàn)接口函數(shù)

      2.1 初始化信號量

      #include int sem_init(sem_t *sem, int pshared, unsigned int value); //通常 pshared 為 0.表示線程間

      sem_init是創(chuàng)建信號量的 API,其中 value 為信號量的初值,pshared 表示是否為多進(jìn)程共享而不僅僅是用于一個進(jìn)程之間的多線程共享。

      如果pshared的值為0,那么信號量在進(jìn)程的線程之間共享,并且應(yīng)位于所有線程可見的某個地址(例如,全局變量)能夠,或在堆上動態(tài)分配的變量),如果pshared不為零,那么信號量在進(jìn)程之間共享,信號量的值就位于共享內(nèi)存區(qū)域。

      2.2 注銷信號量

      int sem_destroy(sem_t * sem);

      注銷信號量時,必須保證被注銷的信號量 sem沒有線程在等待該信號量,否則會返回-1,且置 errno 為 EBUSY。正常返回0。

      2.3 釋放信號量

      int sem_post(sem_t * sem); //相當(dāng)于解鎖

      釋放信號量操作將信號量值原子地加 1,表示增加一個可訪問的資源。只有信號量值大于 0,才能訪問公共資源。主要用來增加信號量的值。當(dāng)有線程阻塞在這個信號量上時,調(diào)用這個函數(shù)會使其中的一個線程不在阻塞。

      2.4 等待信號量

      int sem_wait(sem_t * sem); //相當(dāng)于加鎖 int sem_trywait(sem_t * sem); //不阻塞

      sem_wait()用于阻塞等待信號量(獲取信號量),主要被用來阻塞當(dāng)前線程直到信號量 sem 的值大于 0,得到信號量之后,信號量的值會減一。

      2.5 獲取當(dāng)前的信號量值

      int sem_getvalue(sem_t * sem, int * sval);

      讀取sem中的信號量計數(shù),存于*sval 中,并返回 0。

      3. 案例代碼: 信號量框架運(yùn)用模型

      Linux系統(tǒng)編程-(pthread)線程通信(信號量)

      #include #include #include #include #include #include #include #include #include #include sem_t sem; //信號量結(jié)構(gòu) int data; /* 線程工作函數(shù) */ void *thread_work_func(void *dev) { while(1) { sem_wait(&sem); //獲取信號量. 當(dāng)信號量的值大于0才能獲取成功. -- printf("data=%d\n",data); sem_post(&sem); //釋放信號量. ++ sleep(1); } } /* 線程工作函數(shù) */ void *thread_work_func2(void *dev) { while(1) { sem_wait(&sem); //獲取信號量. 當(dāng)信號量的值大于0才能獲取成功. -- data++; sem_post(&sem); //釋放信號量. ++ sleep(1); } } int main(int argc,char **argv) { //初始化信號量 sem_init(&sem,0,1); /*1. 創(chuàng)建子線程1*/ pthread_t thread_id; if(pthread_create(&thread_id,NULL,thread_work_func,NULL)!=0) { printf("子線程1創(chuàng)建失敗.\n"); return -1; } /*2. 創(chuàng)建子線程2*/ pthread_t thread_id2; if(pthread_create(&thread_id2,NULL,thread_work_func2,NULL)!=0) { printf("子線程2創(chuàng)建失敗.\n"); return -1; } /*3. 等待線程的介紹*/ pthread_join(thread_id,NULL); pthread_join(thread_id2,NULL); //銷毀信號量 sem_destroy(&sem); return 0; }

      linux 任務(wù)調(diào)度

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:Excel表格中數(shù)據(jù)比對和查找的技巧是什么(excel表格中怎么比對信息)
      下一篇:【Linux】文件權(quán)限解讀
      相關(guān)文章
      久久综合亚洲色HEZYO社区| 亚洲色大成网站www久久九| 亚洲午夜在线一区| 久久精品亚洲综合| 国产亚洲真人做受在线观看| 亚洲人AV永久一区二区三区久久| 亚洲欧美国产日韩av野草社区| 最新国产成人亚洲精品影院| 亚洲人成在线免费观看| 亚洲国产精品无码久久久| 亚洲av无码片区一区二区三区| 亚洲国产精品成人精品软件| 亚洲精品无码久久久久久久 | 国产亚洲人成在线影院| 大桥未久亚洲无av码在线| 国产精品国产亚洲区艳妇糸列短篇| 亚洲av日韩综合一区二区三区| 亚洲精品国产suv一区88| 亚洲Av永久无码精品一区二区| WWW亚洲色大成网络.COM| 亚洲1区2区3区精华液| 色窝窝亚洲av网| 亚洲精品网站在线观看不卡无广告 | 亚洲AV无码专区在线观看成人| 亚洲av无码无线在线观看| 亚洲成a人片在线观看久| 国产精品亚洲精品日韩已方| 亚洲毛片αv无线播放一区| 亚洲av无码国产精品夜色午夜 | 国产亚洲人成在线播放| 日韩亚洲国产二区| 亚洲国产精品一区二区三区久久| 精品亚洲成α人无码成α在线观看 | 亚洲精品自偷自拍无码| 亚洲AV无码专区亚洲AV桃| 亚洲AⅤ永久无码精品AA| 亚洲尤码不卡AV麻豆| 亚洲日本在线观看| ass亚洲**毛茸茸pics| 亚洲国产精品日韩av不卡在线| 亚洲国产精品尤物YW在线观看 |