信号量编程:使用信号量控制A、B两个程序同步交替运行,即B运行3秒、A运行3秒、B运行3秒…… ,循环10次后两个程序结束运行。
时间: 2023-11-27 14:55:33 浏览: 35
这是一个经典的生产者-消费者问题,可以通过信号量来实现同步交替运行。以下是一个可能的解决方案(假设 A 程序和 B 程序已经分别实现):
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#define LOOP_TIMES 10
#define RUN_TIME 3
sem_t sem_a, sem_b;
void *thread_a(void *arg)
{
int i;
for (i = 0; i < LOOP_TIMES; i++) {
sem_wait(&sem_a); // 等待 sem_a 可用
printf("A is running\n");
sleep(RUN_TIME);
sem_post(&sem_b); // 释放 sem_b
}
pthread_exit(NULL);
}
void *thread_b(void *arg)
{
int i;
for (i = 0; i < LOOP_TIMES; i++) {
sem_wait(&sem_b); // 等待 sem_b 可用
printf("B is running\n");
sleep(RUN_TIME);
sem_post(&sem_a); // 释放 sem_a
}
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_t tid_a, tid_b;
sem_init(&sem_a, 0, 1); // 初始化 sem_a 为 1
sem_init(&sem_b, 0, 0); // 初始化 sem_b 为 0
pthread_create(&tid_a, NULL, thread_a, NULL);
pthread_create(&tid_b, NULL, thread_b, NULL);
pthread_join(tid_a, NULL);
pthread_join(tid_b, NULL);
sem_destroy(&sem_a);
sem_destroy(&sem_b);
return 0;
}
```
以上代码中,线程 A 和线程 B 分别通过信号量 `sem_a` 和 `sem_b` 实现同步。线程 A 先执行,因为 `sem_a` 被初始化为 1,所以直接通过 `sem_wait(&sem_a)`。执行完毕后调用 `sem_post(&sem_b)` 释放 `sem_b`,此时线程 B 就能够通过 `sem_wait(&sem_b)` 等待 `sem_b` 可用并执行。线程 B 执行完毕后再次释放 `sem_a`,使得线程 A 继续执行。以此类推,实现 A、B 两个程序交替运行。循环 10 次后,两个线程都退出。