#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;
}
#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;
}
#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