PV原子操作
P操作:
- 如果有可用的資源(信號量值>0),則此操作所在的進程占用一個資源(此時信號量值減1,進入臨界區代碼);
- 如果沒有可用的資源(信號量值=0),則此操作所在的進程被阻塞直到系統將資源分配給該進程(進入等待隊列,一直等到資源輪到該進程)。
V操作:
- 如果在該信號量的等待隊列中有進程在等待資源,則喚醒一個阻塞進程;如果沒有進程等待它,則釋放一個資源(即信號量值加1)。
模型
#include <semaphore.h>
sem_t sem //定義信號量
sem_init() //初始化信號量
sem_wait() //獲取信號量,信號量的數值-1
訪問共享資源
sem_post() //釋放一個信號量,及信號量的數值+1
sem_destroy() //如果不再使用信號量,則銷毀信號量
例子
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<string.h>
#include<semaphore.h>
char* buf[5];
int pos;
//1.定義信號量
sem_t sem;
void* task(void* pv){
//3.使用信號量,-1
sem_wait(&sem);
//4.訪問共享內存
buf[pos]=(char*)pv;
sleep(1);
pos++;
//5.使用信號量進行解鎖
sem_post(&sem);
}
main(){
//2.初始化信號量
sem_init(&sem,0,1);
pthread_t thread;
pthread_create(&thread,NULL,task,(void*)"zhangfei");
pthread_t thread2;
pthread_create(&thread2,NULL,task,(void*)"guanyu");
pthread_join(thread,NULL);
pthread_join(thread2,NULL);
//打印字符指針數組中的有效數據
int i=0;
for(i=0;i<pos;i++){
printf("%s ",buf[i]);
}
printf("\n");
//6.如果不再使用則銷毀信號量
sem_destroy(&sem);
return 0;
}