操作系统上机题目(多线程2)

  • 主线程创建4个子线程T1、T2、T3、T4,
  • 主线程在4个子线程退出后,才退出
  • 线程T1、T2、T3、T4的运行时代码如下:
#include <unistd.h> // sleep函数声明在该头文件中

void *T1_entry(void *arg)
{
    sleep(2);  // 睡眠2秒,不准删除此条语句,否则答题无效
    puts(“T1”);
}

void *T2_entry(void *arg)
{
    sleep(1);  // 睡眠1秒,不准删除此条语句,否则答题无效
    puts(“T2”);
}

void *T3_entry(void *arg)
{
    sleep(1);  // 睡眠1秒,不准删除此条语句,否则答题无效
    puts(“T3”);
}

void *T4_entry(void *arg)
{
    puts(“T4”);
}
  • 使用信号量或者条件变量机制(而不是使用sleep函数),使得这四个线程满足如下制约关系:
    • T1的print语句执行后,T2和T3才可以执行print语句
    • T2和T3的print语句执行后,T4才可以执行print语句
  • 程序输出结果为
T1
T2
T3
T4

或者

T1
T3
T2
T4

code:

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

int count=0;

pthread_mutex_t mutex;
pthread_cond_t  wait1;
pthread_cond_t  wait2;
pthread_cond_t  wait3;


void *T1_entry(void *arg){
    int *p=arg;
    pthread_mutex_lock(&mutex);
    while(count!=(*p))
        pthread_cond_wait(&wait1,&mutex);
    sleep(2);
    puts("T1");
    count++;
    pthread_cond_broadcast(&wait2);
    pthread_mutex_unlock(&mutex);
}

void *T2_entry(void *arg){
    int *p=arg;
    pthread_mutex_lock(&mutex);
    while(count<1||count>2)
        pthread_cond_wait(&wait2,&mutex);
    sleep(1);
    puts("T2");
    count++;
    pthread_cond_signal(&wait3);
    pthread_mutex_unlock(&mutex);
}

void *T3_entry(void *arg){
    int *p=arg;
    pthread_mutex_lock(&mutex);
    while(count<1||count>2)
        pthread_cond_wait(&wait2,&mutex);
    sleep(1);
    puts("T3");
    count++;
    pthread_cond_signal(&wait3);
    pthread_mutex_unlock(&mutex);
}

void *T4_entry(void *arg){
    int *p=arg;
    pthread_mutex_lock(&mutex);
    while(count!=(*p))
        pthread_cond_wait(&wait3,&mutex);
    puts("T4");
    pthread_mutex_unlock(&mutex);
}

int main(){
    pthread_t pid[4];
    int j[4];
    int i;
    pthread_mutex_init(&mutex,NULL);
    pthread_cond_init(&wait1,NULL);
    pthread_cond_init(&wait2,NULL);
    pthread_cond_init(&wait3,NULL);
    for(i=0;i<4;i++){
        j[i]=i;
        if(i==0)
            pthread_create(&pid[i],NULL,T1_entry,(void*)&j[i]);
        if(i==1)
            pthread_create(&pid[i],NULL,T2_entry,(void*)&j[i]);
        if(i==2)
            pthread_create(&pid[i],NULL,T3_entry,(void*)&j[i]);
        if(i==3)
            pthread_create(&pid[i],NULL,T4_entry,(void*)&j[i]);
    }
    pthread_join(pid[3],NULL);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Betterc5/article/details/80792433