任务描述
本关任务补充完成程序 4-3.c ,实现如下功能:假设理发店由等待间( 2 个座位)和理发间(只有一个座位)构成,5 位顾客先后进入等待间,再进入理发间。试写出模拟理发师和顾客的程序,要求为每一个顾客创建一个线程,参考输出如下:
相关知识
为了完成本关任务,你需要掌握:
1.多线程程序如何编译;
2.pthread_create 函数的各个参数的含义是什么;
3.主线程结束时,子线程会被杀死吗。
实验准备
4-3.c文件存放在/data/workspace/myshixun/exp5中。
多线程程序如何编译
用 pthread 库实现的多线程程序,可以使用 gcc 来编译,且需加上 -pthread 参数:
pthread_create 函数的各个参数的含义是什么
该函数的原型和各参数的含义如下:
int pthread_create(pthread_t *tidp, const pthread_attr_t *attr,
(void*)(*start_rtn)(void*), void *arg);
第一个参数为指向线程标识符的指针;
第二个参数用来设置线程属性;
第三个参数是线程运行函数的起始地址;
最后一个参数是运行函数的参数。
主线程结束时,子线程会被杀死吗
是的,如果主线程结束时,子线程还没有结束,那么子线程会被操作系统杀死。可以在主线程中使用 pthread_join 来等待子线程结束。
编程要求
(请将修改之后的程序 4-3.c 保存到 myshixun 文件夹下再点击评测。)
注:本关卡使用末尾匹配,只要最后输出结果正确即可通关!!!
实现如下功能:假设理发店由等待间( 2 个座位)和理发间(只有一个座位)构成,5 位顾客先后进入等待间,再进入理发间。试写出模拟理发师和顾客的程序,要求为每一个顾客创建一个线程,参考输出如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#define SEAT_NUM 2
#define CUSTOMER_NUM 5
sem_t start, finish, cutting_seat_empty, empty_waiting_seats;
void sleep_random(int t) {
sleep((int)(t * (rand() / (RAND_MAX *1.0))));
}
void *barber()
{
while(1)
{
sem_wait(&start);
printf("barber: start cutting\n");
sleep_random(3);
printf("barber: finish cutting\n");
sem_post(&finish);
sleep_random(2);
}
}
void *customer(void *id)
{
const int myid = *(int*)id;
sleep_random(2);
printf("customer %d: enter waiting-room\n", myid);
sem_wait(&empty_waiting_seats);
printf("customer %d: sit down\n", myid);
sem_wait(&cutting_seat_empty);
printf("customer %d: enter cutting-room and sit down\n", myid);
sem_post(&empty_waiting_seats);
sem_post(&start);
sem_wait(&finish);
printf("customer %d: bye\n", myid);
sem_post(&cutting_seat_empty);
}
int main()
{
int i, id[CUSTOMER_NUM];
pthread_t t[CUSTOMER_NUM];
srand((int)time(0));
sem_init(&cutting_seat_empty, 0, 1);
sem_init(&empty_waiting_seats, 0, SEAT_NUM);
sem_init(&start, 0, 0);
sem_init(&finish, 0, 0);
for (i = 0; i < CUSTOMER_NUM; i++)
{
id[i] = i + 1;
pthread_create(&t[i], NULL, customer, &id[i]);
}
barber();
return 0;
}