Linux之线程同步二

第一关

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>
 
//全局信号量  sem1已被初始化为1,sem2被初始化为0
extern sem_t sem1, sem2;
 
//全局共享变量
extern char *ch;
 
/************************
 * 参数arg: 是线程函数的参数
*************************/
void *ThreadHandler1(void *arg)
{
	int i = 0;
	for(i = 0; i < 3; i++)
	{
		/********** BEGIN **********/
		sem_wait(&sem1);
		/********** END **********/
		printf("%c", *ch);
		usleep(100);
		ch++;
		
		/********** BEGIN **********/
		sem_post(&sem1);
		/********** END **********/
	}
	
	pthread_exit(NULL);
}
 
/************************
 * 参数arg: 是线程函数的参数
*************************/
void *ThreadHandler2(void *arg)
{
	int i = 0;
	for(i = 0; i < 3; i++)
	{
		/********** BEGIN **********/
		sem_wait(&sem1);
		/********** END **********/
		printf("%c", *ch);
		ch++;
		
		/********** BEGIN **********/
		sem_post(&sem1);
		/********** END **********/
	}
	
	pthread_exit(NULL);
}

第二关

#include <stdio.h>
#include <pthread.h>
 
//全局读写锁
extern pthread_rwlock_t rwlock;
 
//全局共享变量
extern char buffer[3];
extern int position;
 
/************************
 * 参数arg: 是线程函数的参数
*************************/
void *ReadHandler(void *arg)
{
	int i;
	for(i = 0; i < 3; i++)
	{
		/********** BEGIN **********/
		pthread_rwlock_rdlock(&rwlock);
		/********** END **********/
		printf("%c\n", buffer[i]);
		
		/********** BEGIN **********/
		pthread_rwlock_unlock(&rwlock);
		/********** END **********/
		
		usleep(800);
	}
	
 
	pthread_exit(NULL);
}
 
/************************
 * 参数arg: 是线程函数的参数
*************************/
void *WriteHandler(void *arg)
{
	/********** BEGIN **********/
	pthread_rwlock_wrlock(&rwlock);
	/********** END **********/
 
	buffer[position] = *(char*)arg;
	sleep(1);
	position++;
	
	/********** BEGIN **********/
	pthread_rwlock_unlock(&rwlock);
	/********** END **********/
 
	pthread_exit(NULL);
}

第三关

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
 
//记录读线程的个数
extern int reader;
 
//全局的信号量变量
extern sem_t sem_read, sem_write;
 
//读写锁初始化函数
void sem_rwlock_init()
{
	reader = 0;
	//初始化信号量个1
	sem_init(&sem_read, 0, 1);
	sem_init(&sem_write, 0, 1);
}
 
//读写锁注销函数
void sem_rwlock_destroy()
{
	sem_destroy(&sem_read);
	sem_destroy(&sem_write);
}
 
//读模式下的加锁操作
void sem_rwlock_rdlock()
{
	//读模式下加锁操作
	/********** BEGIN **********/
	sem_wait(&sem_read);
    if(reader == 0)
        sem_wait(&sem_write); 
    reader++;
    sem_post(&sem_read);
	/********** END **********/
}
 
//读模式下的解锁操作
void sem_rwlock_unrdlock()
{
	//读模式下解锁操作
	/********** BEGIN **********/
    sem_wait(&sem_read);
    reader--;
    if(reader == 0)
       sem_post(&sem_write);
	sem_post(&sem_read);
	/********** END **********/
}
 
//写模式下的加锁操作
void sem_rwlock_wrlock()
{
	sem_wait(&sem_write);
}
 
//写模式下的解锁操作
void sem_rwlock_unwrlock()
{
	sem_post(&sem_write);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值