linux利用线程和信号量机制实现司机售票员同步操作问题代码
时间: 2024-05-15 18:15:38 浏览: 116
以下是一个简单的示例代码,其中包含一个线程代表司机,一个线程代表售票员,以及两个信号量实现同步操作:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define NUM_TICKETS 20
// 定义两个信号量
sem_t driver_sem;
sem_t conductor_sem;
// 定义全局变量表示剩余票数
int remaining_tickets = NUM_TICKETS;
// 司机线程函数
void *driver_thread(void *arg) {
while (remaining_tickets > 0) {
// 等待售票员发信号
sem_wait(&conductor_sem);
printf("Driver: Bus is ready to go.\n");
// 售票员已发出信号,司机开始发车
printf("Driver: Bus is leaving now.\n");
remaining_tickets--;
// 发送信号给售票员
sem_post(&driver_sem);
}
pthread_exit(NULL);
}
// 售票员线程函数
void *conductor_thread(void *arg) {
while (remaining_tickets > 0) {
// 售票员发信号给司机
sem_post(&conductor_sem);
// 等待司机发信号
sem_wait(&driver_sem);
printf("Conductor: Ticket sold. Remaining tickets: %d\n", remaining_tickets);
}
pthread_exit(NULL);
}
int main(int argc, char *argv[]) {
pthread_t driver_tid, conductor_tid;
sem_init(&driver_sem, 0, 0);
sem_init(&conductor_sem, 0, 0);
pthread_create(&driver_tid, NULL, driver_thread, NULL);
pthread_create(&conductor_tid, NULL, conductor_thread, NULL);
pthread_join(driver_tid, NULL);
pthread_join(conductor_tid, NULL);
sem_destroy(&driver_sem);
sem_destroy(&conductor_sem);
return 0;
}
```
在这个示例中,售票员线程会先发出信号,然后等待司机线程发出信号。司机线程会等待售票员线程发出信号,然后进行发车操作并减少票数,最后再发出信号给售票员线程。这样就实现了司机和售票员之间的同步操作。
阅读全文