孤问尘
孤问尘
Published on 2025-01-13 / 0 Visits
0
0

前趋图实验

给定 P0,P1,P2,P3 工作任务(进程或者线程),满足以下前趋图约束

p0->p1,p0->p2,p1->p3,p2->p3

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

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;  
pthread_cond_t cond_BC = PTHREAD_COND_INITIALIZER;  
pthread_cond_t cond_D = PTHREAD_COND_INITIALIZER;  

int is_A_done = 0; // 线程A是否完成  
int num_BC_done = 0; // 线程B和C完成的数量

void* thread_A(void* arg) {  
    printf("线程A正在执行...\n");  
    pthread_mutex_lock(&mutex);  
    is_A_done = 1;  
    pthread_cond_broadcast(&cond_BC); // 通知线程B和C可以开始执行了  
    pthread_mutex_unlock(&mutex);  
    return NULL;  
}  

void* thread_B_C(void* arg) {  
    pthread_mutex_lock(&mutex);  
    while (!is_A_done) { // 等待线程A完成  
        pthread_cond_wait(&cond_BC, &mutex);  
    }  
    pthread_mutex_unlock(&mutex);  
  
    printf("线程%s正在执行...\n", (char*)arg);  

    pthread_mutex_lock(&mutex);  
    num_BC_done++;  
    if (num_BC_done == 2) { // 如果线程B和C都完成了  
        pthread_cond_signal(&cond_D); // 通知线程D可以开始执行了  
    }  
    pthread_mutex_unlock(&mutex);  
    return NULL;  
}  

void* thread_D(void* arg) {  
    pthread_mutex_lock(&mutex);  
    while (num_BC_done < 2) { // 等待线程B和C都完成  
        pthread_cond_wait(&cond_D, &mutex);  
    }  
    pthread_mutex_unlock(&mutex);  
  
    printf("线程D正在执行...\n");  
    return NULL;  
}

int main() {  
    pthread_t threadA, threadB, threadC, threadD;  
    char *threadB_arg = "B";
    char *threadC_arg = "C";

    pthread_create(&threadA, NULL, thread_A, NULL);
	pthread_create(&threadB, NULL, thread_B_C, (void *)threadB_arg);
	pthread_create(&threadC, NULL, thread_B_C, (void *)threadC_arg);
    pthread_create(&threadD, NULL, thread_D, NULL);

	pthread_join(threadA, NULL);
	pthread_join(threadB, NULL);
	pthread_join(threadC, NULL);
    pthread_join(threadD, NULL);
    return 0;
}


Comment