编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推

编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推

首先三个线程如果不同步的话,是处于竞争状态的,那么会导致乱序执行,系统的调度算法是时间片轮询的话,那么会出现一个线程运行一段时间,然后另一个线程再运行一段时间…

要满足ABCABC…一次递推的话,那么必然要使用同步的方法控制三个线程的运行顺序

A->B B->C C->A

这三个线程相当于是一个环,都互相死等,此时是处于死锁状态

解除死锁让A先运行,就需要我们的主线程,手动解除A的wait条件

/*************************************************************************
    > File Name: ABC.c
    > 作者:YJK
    > Mail: 745506980@qq.com
    > Created Time: 2021年05月13日 星期四 13时10分22秒
 ************************************************************************/

#include<stdio.h>
#include<pthread.h>
#include <unistd.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t condC_A = PTHREAD_COND_INITIALIZER;
pthread_cond_t condA_B = PTHREAD_COND_INITIALIZER;
pthread_cond_t condB_C = PTHREAD_COND_INITIALIZER;
void *threadA(void *arg)
{
	for (int i = 0; i < 10; i++)
	{
		pthread_mutex_lock(&mutex);
		pthread_cond_wait(&condC_A, &mutex); // 解锁mutex,阻塞 函数返回加锁
		printf("A-----%ld\n", pthread_self()); 
		pthread_mutex_unlock(&mutex);
		pthread_cond_signal(&condA_B);
	}
}
void * threadB(void *arg)
{
	for (int i = 0; i < 10; i++)
	{
		pthread_mutex_lock(&mutex);
		pthread_cond_wait(&condA_B, &mutex); // 解锁mutex,阻塞 函数返回加锁
		printf("B-----%ld\n", pthread_self());
		pthread_mutex_unlock(&mutex);
		pthread_cond_signal(&condB_C);
	}
}
void * threadC(void *arg)
{
	for (int i = 0; i < 10; i++)
	{
		pthread_mutex_lock(&mutex);
		pthread_cond_wait(&condB_C, &mutex); // 解锁mutex,阻塞 函数返回加锁
		printf("C-----%ld\n", pthread_self());
		pthread_mutex_unlock(&mutex);
		pthread_cond_signal(&condC_A);
	}
}
int main(int argc,char *argv[])
{
	pthread_t tida, tidb,tidc;
	pthread_create(&tida, NULL, threadA, NULL);
	pthread_create(&tidb, NULL, threadB, NULL);
	pthread_create(&tidc, NULL, threadC, NULL);
	pthread_cond_signal(&condC_A);  //手动唤醒A线程
	pthread_join(tida, NULL);
	pthread_join(tidb, NULL);
	pthread_join(tidc, NULL);
	return 0;
}

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值