![](https://img.51dongshi.com/20250104/wz/18542799052.jpg)
系統大全為您提供信號量和互斥鎖(mutex)的區別:互斥鎖只允許一個線程進入臨界區,而信號量允許多個線程同時進入臨界區。不多做解釋,要使用信號量同步,需要包含頭文件semaphore.h。主要用到的函數:intsem_init(sem_t*sem,intpshared,unsignedintvalue);,其中sem是要初始化的信號量,pshared表示此信號量是在進程間共享還是線程間共享,value是信號量的初始值。intsem_destroy(sem_t*sem);,其中sem是要銷毀的信號量。只有用sem_init初始化的信號量才能用sem_destroy銷毀。intsem_wait(sem_t*sem);等待信號量,如果信號量的值大于0,將信號量的值減1,立即返回。如果信號量的值為0,則線程阻塞。相當于P操作。成功返回0,失敗返回-1。intsem_post(sem_t*sem);釋放信號量,讓信號量的值加1。相當于V操作。下列的代碼演示了如何用信號量同步,模擬一個窗口服務系統。/*@purpose:基于信號量的多線程同步,操作系統原理中的P,V操作?*@author:jollywing@foxmail.com?*@create:2015-03-20Fri?**/?#include
#include#include#include#include??/*@Scene:某行業營業廳同時只能服務兩個顧客。?*有多個顧客到來,每個顧客如果發現服務窗口已滿,就等待,?*如果有可用的服務窗口,就接受服務。*/?/*將信號量定義為全局變量,方便多個線程共享*/sem_tsem;?/*每個線程要運行的例程*/void*get_service(void*thread_id){??/*注意:立即保存thread_id的值,因為thread_id是對主線程中循環變量i的引用,它可能馬上被修改*/??intcustomer_id=*((int*)thread_id);???if(sem_wait(&sem)==0){????usleep(100);????????/*servicetime:100ms*/????printf("customer%dreceiveservice...",customer_id);????sem_post(&sem);??}}?#defineCUSTOMER_NUM10?intmain(intargc,char*argv[]){??/*初始化信號量,初始值為2,表示有兩個顧客可以同時接收服務*/??/*@prototype:intsem_init(sem_t*sem,intpshared,unsignedintvalue);*/??/*pshared:ifpshared==0,thesemaphoreissharedamongthreadsofaprocess???*otherwisethesemaphoreissharedbetweenprocesses.?*/??sem_init(&sem,0,2);???/*為每個顧客定義一個線程id,pthread_t其實是unsignedlongint*/??pthread_tcustomers[CUSTOMER_NUM];???inti,ret;??/*為每個顧客生成一個線程*/??for(i=0;i