【发布时间】:2017-04-07 12:48:02
【问题描述】:
我很难理解如何使用信号量在两个进程之间交替控制。这是一个人为设计的流程处理代码示例。
int pid = fork();
if (pid) {
int counter = 0;
while (true) {
counter += 1;
printf("P%d = %d", pid, counter);
}
} else {
int counter = 0;
while (true) {
counter += 1;
printf("P%d = %d", pid, counter);
}
}
我原以为上面的代码可以并行运行,但对于分叉的进程,控制流似乎会立即继续,而父进程只会在稍后恢复。
这从根本上破坏了我现有的使用信号量来控制哪个进程可以执行的代码。
int id = get_semaphore(1);
int pid = fork();
if (pid) {
int counter = 0;
while (true) {
sem_wait(id);
counter += 1;
printf("P%d = %d\n", pid, counter);
sem_signal(id);
}
} else {
int counter = 0;
while (true) {
sem_wait(id);
counter += 1;
printf("P%d = %d\n", pid, counter);
sem_signal(id);
}
}
sem_wait助手只是从信号量值中减去 1 并阻塞直到结果 > 0(在后台使用semop)。sem_signal助手只是将信号量值加 1(在后台使用semop)。
我希望代码在两个进程之间交替,使用sem_wait 阻塞,直到另一个进程使用sem_signal 释放资源。期望的输出是:
P1 = 0
P0 = 0
P1 = 1
P0 = 1
...
但是,由于进程之间的初始执行延迟,子进程获取可用的信号量资源,使用它打印一个数字,然后恢复它并循环——此时资源再次可用,所以它继续没有一直在等待其他进程。
如果进程自行释放资源,那么防止进程使用资源的最佳方法是什么?
【问题讨论】:
-
您需要两个信号量和一个“executeNow”单元。在进程之间来回传递单元。