Linux信号量之用户态信号量(Posix信号量->无名信号量)

本文介绍了Linux中无名信号量在多线程同步中的应用,包括初始化、等待、释放信号量的API,并指出Linux仅实现了无名信号量用于线程间通信,与有名信号量的区别。信号量可用于解决资源抢占问题及实现高速缓存的同步。
摘要由CSDN通过智能技术生成

相关API:

1、初始化信号量

int sem_init(sem_t* sem,int pshared,unsigned int value);
//pshared为信号量最多由几个进程共享。Linux中只能取o。value一般为1,表示资源可用,为o表示不可用

2、等待信号量,如果信号量为0则等待,如果信号量大于0则返回,同时对值做减1操作

int sem_wait(sem_t* sem);
int sem_trywait(sem_t* sem);
int sem_timedwait(sem_t* sem,const struct timespec* abs_timeout);

3、释放信号量,信号量加1操作

int sem_post(sem_t* sem);

4、获取信号量的值

int sem_getvalue(sem_t* sem,int* sval);

5、销毁信号量

int sem_destroy(sem_t* sem);

信号量在进程是以有名信号量进行通信的,在线程是以无名信号进行通信的。

由于linux还没有实现进程间的通信,只实现了无名信号量,所以在sem_init的第二个参数要为0。

在多线程间的同步是可以通过有名信号量也可通过无名信号,但是一般情况线程的同步是无名信号量,无名信号量使用简单,而且sem_t存储在进程空间中,有名信号量必须LINUX内核管理,由内核结构struct ipc_ids存储,是随内核持续的,系统关闭,信号量则删除,当然也可以显示删除,通过系统调用删除,消息队列,信号量,内存共享,这几个都是一样的原理。

使用信号量解决多线程抢占资源的问题

#include <stdio.h>
#include <stdlib.h>
#include <unisd.h>
#include <pthread.h>
#include <string.h>
#include <semaphore.h>

char buffer[1024];

sem_t sem;//声明信号量

void *pthfun(){
   
  for(int ii=0;ii<3;ii++){
   
    printf("%d:%ld:lock...\n",time(0
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值