#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<string.h>
char str[]="kkkddd";
pthread_mutex_t mutex;
//条件变量初始化
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
int flag=0;
//0打印,1倒置
void* callBack_print(void* arg)
{
while(1)
{
/*****临界区***********/
//上锁
pthread_mutex_lock(&mutex);
//如果不是当前线程要运行的时机,则需要将当前线程休眠
if(0 != flag)
{
//1.让当前线程进入休眠,同时解开互斥锁。
//2.等待被其他线程用cond条件变量唤醒。
pthread_cond_wait(&cond, &mutex);
//3.唤醒成功后,立刻尝试上锁。
//4.如果上锁成功,则从唤醒位置继续往后执行。
//5.如果上锁失败,则重新睡在cond上,等待下一次唤醒。
}
printf("%s\n", str);
flag = 1;
//唤醒睡在cond上的线程
pthread_cond_signal(&cond);
//解锁
pthread_mutex_unlock(&mutex);
/*****临界区***********/
}
pthread_exit(NULL);
}
void* callBack_reserve(void* arg)
{
int i = 0;
char temp = 0;
while(1)
{
/*****临界区***********/
//上锁
pthread_mutex_lock(&mutex);
//如果不是当前线程要运行的时机,则需要将当前线程休眠
if(1 != flag)
{
//1.让当前线程进入休眠,同时解开互斥锁。
//2.等待被其他线程用cond条件变量唤醒。
pthread_cond_wait(&cond, &mutex);
//3.唤醒成功后,立刻尝试上锁。
//4.如果上锁成功,则从唤醒位置继续往后执行。
//5.如果上锁失败,则重新睡在cond上,等待下一次唤醒。
}
for(i=0; i<strlen(str)/2; i++)
{
temp = str[i];
str[i] = str[strlen(str)-1-i];
str[strlen(str)-1-i] = temp;
}
flag = 0;
//唤醒睡在cond上的线程
pthread_cond_signal(&cond);
//解锁
pthread_mutex_unlock(&mutex);
/*****临界区***********/
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//创建互斥锁
pthread_mutex_init(&mutex,NULL);
//创建两个线程
pthread_t tid1,tid2;
if(pthread_create(&tid1,NULL,callBack_print,NULL)!=0)
{
perror("pthread_create");
return -1;
}
if(pthread_create(&tid2,NULL,callBack_reserve,NULL)!=0)
{
perror("pthread_create");
return -1;
}
//阻塞等待分支线程退出
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
//销毁互斥锁
if(pthread_mutex_destroy(&mutex)!=0)
{
perror("pthread_mutex_destroy");
return -1;
}
//销毁条件 变量
if(pthread_cond_destroy(&cond)!=0)
{
perror("pthread_cond_destroy");
return -1;
}
return 0;
}
条件变量结合互斥锁,实现字符循环倒置打印
最新推荐文章于 2024-07-24 10:46:51 发布