- 主線程創建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;
}