编写一个程序,开启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;
}
