线程间的同步与互斥—信号量

线程间的同步与互斥—信号量

之前的博客有学习过关于进程间通信的信号量,那关于线程之间的同步和互斥的信号量是怎么理解的呢?

线程之间的Mutex变量是非0即1的,可以看作是一种资源的计数器,初始化时Mutex是1,表示有一个可用资源,加锁的时候表示获得该资源,将Mutex减1,置为0,表示此时没有可用资源,解锁的时候在重新释放该资源,将Mutex重新加到1,表示此时又有了一个资源。关于信号量的基础概念在这里就不多讲了,详情请参看我的另外一篇微博:点击打开链接

关于线程之间的同步和互斥的信号量,我们有专门的命名:semaphore

semaphore变量的类型为sem_t,关于semaphore也有相关的一套调用接口:

头文件:#include<semaphore.h>

初始化:int sem_init(sem_t* sem,int pshared,unsigned int value)

 sem:要初始化的信号量 pshared:设置是否共享 value:信号量的初始值

P操作:int sem_wait(sem_t* sem) int sem_trywait(sem_t* sem)

V操作:int sem_post(sem_t* sem)

销毁:int sem_destroy(sem_t* sem)



我们用一段代码来深入理解一下以上的信号量的概念,现在我们使用循环队列模拟生产者和消费者,其中信号量我们采用多元

信号量,将循环队列当作我们的临界资源,原理图:


代码:

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>

#define N 64

int ring[N];
sem_t blank_sem;
sem_t data_sem;

void* product(void* arg)
{
	int step = 0;
	int i=0;
	while(1){
		int data = i;
		sem_wait(&blank_sem);
		ring[step] = data;
		sem_post(&data_sem);
		printf("product done:%d\n",data);
		step++;
		i++;
		step %=N;
	}
}

void* consumer(void*arg)
{
	int step = 0;
	while(1){
		int data = -1;
		sem_wait(&data_sem);
		data = ring[step];
		sem_post(&blank_sem);
		printf("consumer done:%d\n",data);
		step++;
		step %= N;
		sleep(1);
	}

}

int main()
{
	pthread_t c,p;

	sem_init(&blank_sem,0,64);
	sem_init(&data_sem, 0, 0);
	pthread_create(&p,NULL,product,NULL);
	pthread_create(&c,NULL,consumer,NULL);

	pthread_join(p,NULL);
	pthread_join(c,NULL);

	sem_destroy(&blank_sem);
	sem_destroy(&data_sem);
	return 0;
}


代码中因为我们在消费者线程中,让他sleep了1秒,所以生产者会一瞬间把64个空间生产完成,空间里面存储的就

0到63,然后消费者在从空间里面拿数据,第一次拿一个1,然后生产者在生产一个64,放到循环队列的末尾,然后

一次循环。

这样,我们基于线程间同步与互斥的信号量的生产者和消费者的模型就完成了,有关信号量的接口,也学习完成。



限于笔者水平,文章难免有缺漏之处,欢迎指正~!

如需转在请注明出处。

猜你喜欢

转载自blog.csdn.net/dy_1024/article/details/79263667