linux信号量机制(semaphore)

时间:2021-01-20 15:18:49

linux信号量机制(semaphore)

信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。当公共资源增加时,调用函数sem_post()增加信号量。只有当信号量值大于0时,才能使用公共资源,使用后,函数sem_wait()减少信号量。函数sem_trywait()和函数pthread_mutex_trylock()起同样的作用,它是函数sem_wait()的非阻塞版本。它们都在头文件/usr/include/semaphore.h中定义。

信号量的数据类型为结构sem_t,它本质上是一个长整型的数。

函数sem_init()用来初始化一个信号量。它的原型为:

extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));

sem为指向信号量结构的一个指针;
pshared不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共享;
value给出了信号量的初始值。

函数sem_post( sem_t *sem )用来增加信号量的值。当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不在阻塞,选择机制同样是由线程的调度策略决定的。
函数sem_wait( sem_t *sem )被用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减一,表明公共资源经使用后减少。
函数sem_trywait ( sem_t *sem )是函数sem_wait()的非阻塞版本,它直接将信号量sem的值减一。
函数sem_destroy(sem_t *sem)用来释放信号量sem。

ps:进程1,进程2之间可以互斥资源,相互等待

//进程1
char SEM_NAME1[] = "vik1";
sem_t *sem1;
sem1 = sem_open(SEM_NAME1,O_CREAT,777,0);
//代码函数执行完成
……
sem_post(sem1);

sem_close(sem3);
sem_unlink(SEM_NAME3)

//进程2
char SEM_NAME1[] = "vik1";
sem_t *sem1;
sem1 = sem_open(SEM_NAME1,O_CREAT,777,0);
sem_wait(sem1);
//代码函数等待信号后执行
……
sem_close(sem3);
sem_unlink(SEM_NAME3)