理发师问题

任务描述
本关任务补充完成程序 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值