POSIX信号量

目录

一 介绍

二 POSIX信号量的相关函数

2.1 信号量的初始化

2.2 信号量的销毁

2.3 信号量减一操作(阻塞)

2.4 信号量减一操作(非阻塞)

2.5 信号量加一操作

三 POSIX信号量的使用


一 介绍

由于线程和进程一样,也需要考虑同步操作,线程的同步操作主要有POSIX信号量,互斥锁以及条件变量。其中,POSIX信号量和之前介绍的IPC信号量一样,具有相同的功能。接下来,我们直入主题,具体来看看POSIX信号量如何使用吧!

二 POSIX信号量的相关函数

POSIX信号量相关函数在semaphore.h头文件当中。

2.1 信号量的初始化

int sem_init(sem_t*sem,int pshared,unsigned int value);

函数功能:初始化一个信号量,并且其初值为value。

函数参数:

1.pshared:取0时信号量只属于当前进程的局部信号量,取1时信号量可以被多个进程共享。

2.value:信号量sem的初值。

2.2 信号量的销毁

int sem_destroy(sem_t*sem);

函数功能:用于销毁信号量sem,并且释放内核中资源。如果释放正在被其他线程等待的信号量将导致不可预估的后果。

2.3 信号量减一操作(阻塞)

int sem_wait(sem_t*sem);

函数功能:用于将信号量的值减一。如果信号量当前值为0,则会阻塞直到该信号量的值非零。

2.4 信号量减一操作(非阻塞)

int sem_trywait(sem_t*sem);

函数功能:用于将信号量的值减一。如果信号量的当前值为0,则不阻塞之间返回-1,设置错误码EAGAIN。

2.5 信号量加一操作

int sem_post(sem_t*sem);

函数功能:用于将信号量的值加一,如果有其他线程阻塞在sem_wait()函数中,则会唤醒该线程。

三 POSIX信号量的使用

测试代码:

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

sem_t sem;
int data = 0;

void* thread()
{
	sem_wait(&sem);
	data++;
	printf("数据大小:%d\n", data);
	sleep(2);
	data--;
	sem_post(&sem);
}

int main()
{
	int ret = sem_init(&sem, 0, 2);
	if(ret != 0)
	{
		printf("创建信号量失败");
		return -1;
	}

	pthread_t tid1, tid2, tid3;
	ret = pthread_create(&tid1, NULL, thread, NULL);
	if(ret != 0)
	{
		printf("创建线程1失败");
		return -1;
	}
	ret = pthread_create(&tid2, NULL, thread, NULL);
	if(ret != 0)
	{
		printf("创建线程2失败");
		return -1;
	}
	ret = pthread_create(&tid3, NULL, thread, NULL);
	if(ret != 0)
	{
		printf("创建线程3失败");
		return -1;
	}

	pthread_join(tid1, NULL);
	pthread_join(tid2, NULL);
	pthread_join(tid3, NULL);
	sem_destroy(&sem);
	
	return 0;
}

加信号量:

不加信号量:

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值