Linux 多線程信號量同步


PV原子操作

P操作:

  • 如果有可用的資源(信號量值>0),則此操作所在的進程占用一個資源(此時信號量值減1,進入臨界區代碼);
  • 如果沒有可用的資源(信號量值=0),則此操作所在的進程被阻塞直到系統將資源分配給該進程(進入等待隊列,一直等到資源輪到該進程)。

V操作:

  • 如果在該信號量的等待隊列中有進程在等待資源,則喚醒一個阻塞進程;如果沒有進程等待它,則釋放一個資源(即信號量值加1)。

模型

#include <semaphore.h>
sem_t sem        //定義信號量							
sem_init()       //初始化信號量						
sem_wait()       //獲取信號量,信號量的數值-1
訪問共享資源
sem_post()       //釋放一個信號量,及信號量的數值+1	
sem_destroy()    //如果不再使用信號量,則銷毀信號量	

函數和POSIX IPC的信號量相同

例子

#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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM