https://blog.csdn.net/senllang/article/details/130902269

#include <stdio.h>
#include <pthread.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;   // 定义互斥锁
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;     // 定义条件变量

int car_wash_progress=0;

void *thread_host(void *arg) 
{
        printf("等待洗车店通知,我可以去打两把游戏了...\n");
        pthread_mutex_lock(&mutex);   // 加锁

        while(car_wash_progress < 100)  // 防止虚假唤醒
        {
            pthread_cond_wait(&cond, &mutex);    // 等待条件变量

            printf("车洗完了通知? \n");         
        }

        printf("车洗完了,我要开走了..\n");
        pthread_mutex_unlock(&mutex); // 解锁
    return NULL;
}

void *thread_CarWash(void *arg) 
{

    while(car_wash_progress < 100)
    {
        printf("洗车店洗车中..\n");
        pthread_mutex_lock(&mutex);   // 加锁
        car_wash_progress++;
        pthread_mutex_unlock(&mutex); // 解锁
    }

    printf("车洗完了,通知车主..\n");
    pthread_cond_signal(&cond);    // 等待条件变量

    return NULL;
}

int main() 
{
    pthread_t tid[2];
    printf("主线程正在创建子线程...\n");

    /* 先创建车主线程任务,避免唤醒丢失 */
    pthread_create(&tid[0], NULL, thread_host, NULL);    // 创建子线程
    pthread_create(&tid[1], NULL, thread_CarWash, NULL);    // 创建子线程

    pthread_join(tid[1], NULL);    // 等待子线程结束
    pthread_join(tid[0], NULL);
    return 0;
}

0 条评论

发表回复

您的电子邮箱地址不会被公开。