日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux编程练习 --多线程5--信号量(semaphore)

發(fā)布時間:2023/12/10 linux 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux编程练习 --多线程5--信号量(semaphore) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這一篇練習(xí)信號量的應(yīng)用

信號量本質(zhì)上是一個非負(fù)的整數(shù)計數(shù)器,也是UNIX中古老的實現(xiàn)進程互斥和同步的手段,Linux下信號量概念是在線程中,信號則在進程控制中,不過原理差不多,最基本最經(jīng)典的操作莫過于P、V操作了,能實現(xiàn)進程、線程的互斥和同步操作,非常值得深入理解。

1.P、V操作原語

?P操作:

?proceduce P(var s:semaphore)

{

? begin

????? s:=s-1;

????? if(s<0)then W(s);

? end

}

?

V操作:

?proceduce V(var s:semaphore)

{

? begin

????? s:=s+1;

????? if(s<=0)then R(s);

? end

}?

?

2.基本操作

數(shù)據(jù)類型:信號量的數(shù)據(jù)類型為結(jié)構(gòu)sem_t,它本質(zhì)上是一個長整型的數(shù)。

函數(shù):

(1)sem_init

功能:???????? 用于創(chuàng)建一個信號量,并初始化信號量的值。

頭文件:?????? <semaphore.h>

函數(shù)原型:???? int sem_init (sem_t* sem, int pshared, unsigned int value);

函數(shù)傳入值:?? sem:信號量。

?????????????????? pshared:決定信號量能否在幾個進程間共享。由于目前LINUX還沒有實現(xiàn)進

?????????????????????????????? 程間共享信息量,所以這個值只能取0。

?????????????????? value:初始計算器

函數(shù)返回值:?? 0:成功。

?????????????????? -1:失敗。

(2)其他函數(shù)。

//等待信號量

int sem_wait?????? (sem_t* sem);

int sem_trywait?? (sem_t* sem);

//發(fā)送信號量

int sem_post?????? (sem_t* sem);

//得到信號量值

int sem_getvalue (sem_t* sem);

//刪除信號量

int sem_destroy?? (sem_t* sem);

功能:sem_wait和sem_trywait相當(dāng)于P操作,它們都能將信號量的值減一,兩者的區(qū)別在

??????? 于若信號量的值小于零時,sem_wait將會阻塞進程,而sem_trywait則會立即返回。

??????? sem_post相當(dāng)于V操作,它將信號量的值加一,同時發(fā)出喚醒的信號給等待的進程

?????? (或線程)。

??????? sem_getvalue 得到信號量的值。

??????? sem_destroy 摧毀信號量。

函數(shù)傳入值: sem:信號量。

函數(shù)返回值: 同上。

好了,了解完基本操作,繼續(xù)做一個練習(xí):

這里用信號量實現(xiàn)互斥資源訪問的功能:

  • /*sem.c*/??
  • #include?<stdlib.h>????
  • #include?<stdio.h>????
  • #include?<pthread.h>????
  • #include?<semaphore.h>??
  • #include?<errno.h>?????
  • /*全局變量*/??
  • int?gnum?=?0;??
  • /*信號量*/??
  • sem_t?sem;??
  • /*聲明線程運行服務(wù)程序*/??
  • static?void?pthread_func_1?(void);?????
  • static?void?pthread_func_2?(void);?????
  • ????
  • int?main?(void)?????
  • {?????
  • ?/*線程的標(biāo)識符*/??
  • ??pthread_t?pt_1?=?0;?????
  • ??pthread_t?pt_2?=?0;?????
  • ??int?ret?=?0;?????
  • ??/*信號量初始化*/??
  • ??sem_init(&sem,0,1);??
  • ??/*分別創(chuàng)建線程1、2*/??
  • ??ret?=?pthread_create?(&pt_1,??????????//線程標(biāo)識符指針??
  • ?????????????????????????NULL,??????????//默認(rèn)屬性??
  • ????????????????????????(void?*)pthread_func_1,//運行函數(shù)??
  • ????????????????????????NULL);??????????//無參數(shù)??
  • ??if?(ret?!=?0)?????
  • ??{?????
  • ?????perror?("pthread_1_create");?????
  • ??}?????
  • ????
  • ??ret?=?pthread_create?(&pt_2,??????????//線程標(biāo)識符指針??
  • ????????????????????????NULL,???????????//默認(rèn)屬性????
  • ????????????????????????(void?*)pthread_func_2,?//運行函數(shù)??
  • ????????????????????????NULL);??????????//無參數(shù)??
  • ??if?(ret?!=?0)?????
  • ??{?????
  • ?????perror?("pthread_2_create");?????
  • ??}?????
  • ??/*等待線程1、2的結(jié)束*/??
  • ??pthread_join?(pt_1,?NULL);?????
  • ??pthread_join?(pt_2,?NULL);?????
  • ????
  • ??printf?("main?programme?exit!/n");????
  • ??return?0;?????
  • }?????
  • /*線程1的服務(wù)程序*/??
  • static?void?pthread_func_1?(void)?????
  • {?????
  • ??int?i?=?0;?????
  • ???????
  • ??for?(;;)?????
  • ??{?????
  • ????printf?("This?is?pthread1!/n");??????
  • ????sem_wait(&sem);?????/*等待信號量*/?????
  • ????sleep?(1);???
  • ????/*臨界資源*/??
  • ????gnum++;??
  • ????printf?("Thread1?add?one?to?num:%d/n",gnum);??
  • ??????
  • ????sem_post?(&sem);????????/*釋放信號量*/??
  • ??
  • ???????
  • ??}?????
  • }?????
  • /*線程2的服務(wù)程序*/???
  • static?void?pthread_func_2?(void)?????
  • {?????
  • ??int?i?=?0;?????
  • ????
  • ??for?(;;)?????
  • ??{?????
  • ????printf?("This?is?pthread2!/n");???
  • ????sem_wait(&sem);?????/*等待信號量*/??
  • ????sleep?(1);??
  • ????/*臨界資源*/??
  • ????gnum++;??
  • ????printf?("Thread2?add?one?to?num:%d/n",gnum);??
  • ??????
  • ????sem_post?(&sem);????????/*釋放信號量*/??
  • ????
  • ??}?????
  • ????
  • ??pthread_exit?(0);?????
  • }????
  • 編譯,運行,可以看出和上次互斥鎖結(jié)果一樣的

    總結(jié)

    以上是生活随笔為你收集整理的Linux编程练习 --多线程5--信号量(semaphore)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。