给定 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;
}