C++DAY31

#include "head.h"
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int flag = 0;
char temp;
ssize_t n=1;
void* callback1(void* arg)
{
	int fd,len;
	fd = open("./txt.c",O_RDONLY);
	len = lseek(fd,0,SEEK_SET);
	while(1)
	{
		pthread_mutex_lock(&mutex);//上锁
		if(flag != 0) //不是当前线程要访问的时机
		{
			//解开互斥锁,并设置一个唤醒条件
			//等待被唤醒
			pthread_cond_wait(&cond,&mutex);
			//当被唤醒后,会立即尝试上锁
			//上锁成功后,则完全唤醒,从当前位置往后执行
			//上锁失败,重新回到cond上休眠,等待下一次唤醒
		}
		/*********临界区**************/
		printf("%c",temp);
		if(0 == n)
		{
			flag = 1;//修改访问时机
			pthread_cond_signal(&cond);//通过指定的条件变量来唤醒对方线程
			pthread_mutex_unlock(&mutex);//解锁
			break;
		}
		/*********临界区**************/	
		flag = 1;//修改访问时机
		pthread_cond_signal(&cond);//通过指定的条件变量来唤醒对方线程
		pthread_mutex_unlock(&mutex);//解锁
	}
	pthread_exit(NULL);
}
void* callback2(void* arg)
{
	int fd,len;
	fd = open("./txt.c",O_RDONLY);
	len = lseek(fd,0,SEEK_SET);
	while(1)
	{
		pthread_mutex_lock(&mutex);
		if(flag != 1) //不是当前线程要访问的时机
		{
			//解开互斥锁,并设置一个唤醒条件
			//等待被唤醒
			pthread_cond_wait(&cond,&mutex);
			//当被唤醒后,会立即尝试上锁
			//上锁成功后,则完全唤醒,从当前位置往后执行
			//上锁失败,重新回到cond上休眠,等待下一次唤醒
		}
		/************临界区**********/
		temp = '\0';
		n=read(fd,&temp,1);
		if(0 == n)
		{
			flag = 0;
			pthread_cond_signal(&cond);//通过指定的条件变量来唤醒对方线程
			pthread_mutex_unlock(&mutex);//解锁
			break;
		}
		/*********临界区**************/
		flag = 0;//修改访问时机
		pthread_cond_signal(&cond);//通过指定的条件变量来唤醒对方线程
		pthread_mutex_unlock(&mutex);//解锁
	}
}
int main(int argc, const char *argv[])
{
	pthread_t tid1,tid2;
	pthread_create(&tid1,NULL,callback1,NULL);
	pthread_create(&tid2,NULL,callback2,NULL);
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	pthread_mutex_destroy(&mutex);//销毁互斥锁
	pthread_cond_destroy(&cond);//销毁条件变量
	return 0;
}

C++DAY31_第1张图片

#include "head.h"
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cone = PTHREAD_COND_INITIALIZER;
pthread_cond_t ctwo = PTHREAD_COND_INITIALIZER;
pthread_cond_t cthree = PTHREAD_COND_INITIALIZER;
int flag = 1;
void* A(void *arg)
{
	while(1)
	{
		pthread_mutex_lock(&mutex);//上锁
		if(flag == 2||flag == 3)//不是当前线程要访问的时机
		{
			//解开互斥锁,并设置一个唤醒条件
			//等待被唤醒
			pthread_cond_wait(&cone,&mutex);
			//当被唤醒后会立即尝试上锁
			//上锁成功,则完全被唤醒,从当前位置继续往后执行
			//上锁失败,重新回到cond上继续休眠,等待下一次唤醒
		}
		/***********临界区*********/
		printf("A");
		/***********临界区*********/
		flag = 2;//修改访问时机
		pthread_cond_signal(&ctwo);//通过指定的条件变量唤醒对方线程
		pthread_mutex_unlock(&mutex);//解锁
	}
	pthread_exit(NULL);
}
void* B(void *arg)
{
	while(1)
	{
		pthread_mutex_lock(&mutex);//上锁
		if(flag == 1 || flag == 3)//不是当前线程要访问的时机
		{
			//解开互斥锁,并设置一个唤醒条件
			//等待被唤醒
			pthread_cond_wait(&ctwo,&mutex);
			//当被唤醒后会立即尝试上锁
			//上锁成功,则完全被唤醒,从当前位置继续往后执行
			//上锁失败,重新回到cond上继续休眠,等待下一次唤醒
		}
		/***********临界区*********/
		printf("B");
		/***********临界区*********/
		flag = 3;//修改访问时机
		pthread_cond_signal(&cthree);//通过指定的条件变量唤醒对方线程
		pthread_mutex_unlock(&mutex);//解锁
	}
	pthread_exit(NULL);
}
void* C(void *arg)
{
	while(1)
	{
		pthread_mutex_lock(&mutex);//上锁
		if(flag == 1 || flag == 2)//不是当前线程要访问的时机
		{
			//解开互斥锁,并设置一个唤醒条件
			//等待被唤醒
			pthread_cond_wait(&cthree,&mutex);
			//当被唤醒后会立即尝试上锁
			//上锁成功,则完全被唤醒,从当前位置继续往后执行
			//上锁失败,重新回到cond上继续休眠,等待下一次唤醒
		}
		/***********临界区*********/
		printf("C\n");
		/***********临界区*********/
		flag = 1;//修改访问时机
		pthread_cond_signal(&cone);//通过指定的条件变量唤醒对方线程
		pthread_mutex_unlock(&mutex);//解锁
	}
	pthread_exit(NULL);
}

int main(int argc, const char *argv[])
{
	pthread_t tid1,tid2,tid3;
	pthread_create(&tid1,NULL,A,NULL);
	pthread_create(&tid2,NULL,B,NULL);
	pthread_create(&tid3,NULL,C,NULL);
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	pthread_join(tid3,NULL);
	pthread_mutex_destroy(&mutex);
	pthread_cond_destroy(&cone);
	pthread_cond_destroy(&ctwo);
	pthread_cond_destroy(&cthree);
	return 0;
}

C++DAY31_第2张图片

C++DAY31_第3张图片

#include "head.h"
char buf[]="1234567";
sem_t sem1,sem2;
void* callback1(void* arg)
{
	while(1)
	{
		if(sem_wait(&sem1) == 0)//P操作
		{
			printf("%s\n",buf);
			sem_post(&sem2);//V操作
		}
	}
	pthread_exit(NULL);
}
void* callback2(void* arg)
{
	while(1)
	{
		if(sem_wait(&sem2) == 0)//P操作
		{
			for(int i=0;i

你可能感兴趣的:(c++,java,前端)