- 主线程创建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;
}