使用信号量独立执行进程
independent execution of processes with semaphores
我使用 semaphores.My 为 unix 项目创建了一个代码,代码是这样的:
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include "display.h"
#include <semaphore.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
typedef struct {
sem_t p1;
sem_t p2;
}SemPair ;
int main ( int argc, char *argv[]) {
SemPair *sem = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED |MAP_ANONYMOUS , -1, 0);
int i=0;
sem_init(&(sem->p1),1,0);
sem_init(&(sem->p2),1,0);
pid_t pid = fork();
if (!pid)
{
for( i=0;i<10;i++) {
sem_wait(&(sem->p2));
display("Hello world\n");
sem_post(&(sem->p1)); }
}
else
{
for( i=0;i<10;i++) {
sem_post(&(sem->p2));
sem_wait(&(sem->p1));
display("Goodnight world\n");
sleep(1);}
}
sem_destroy(&(sem->p1));
sem_destroy(&(sem->p2));
return 0;
}
如您所见,我的问题是我不想按顺序显示,而是 randomly.So 我的输出是这样的。
Hello world
Goodnight world
Hello world
Goodnight world
Hello world
Goodnight world
....
相反,我希望进程不按顺序执行,因此输出将是这样的:
Hello world
Hello world
Hello world
Goodnight world
Hello world
Goodnight world
Goodnight world
....
这不会像您使用信号量那样发生。
导致输出混乱的整个问题(以及您一开始使用信号量的原因)是进程在其写入过程中被中断。
没有信号量,你有这个:
- 进程A开始打印"Hell"
- 进程A被中断;其他进程 运行
- 进程 B 最终获得共享时间并开始打印 "Good"
- 进程B被中断;其他进程 运行
- 进程 A 完成写入 "o world"
你当然知道这件事。您可以看到这如何导致输出被破坏。
重点是信号量如何改变这一点。当你到达第 3 点时,进程 B 将因为调用 sem_wait
而被阻塞(顺便说一句,你的 "process B" 没有正确处理信号量)。当进程 A 将信号量增加回 1 时,sem_post
将立即解锁进程 B 并让它继续,然后进程 A 可以回到循环的开头并再次 运行 sem_wait
。
我使用 semaphores.My 为 unix 项目创建了一个代码,代码是这样的:
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include "display.h"
#include <semaphore.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
typedef struct {
sem_t p1;
sem_t p2;
}SemPair ;
int main ( int argc, char *argv[]) {
SemPair *sem = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED |MAP_ANONYMOUS , -1, 0);
int i=0;
sem_init(&(sem->p1),1,0);
sem_init(&(sem->p2),1,0);
pid_t pid = fork();
if (!pid)
{
for( i=0;i<10;i++) {
sem_wait(&(sem->p2));
display("Hello world\n");
sem_post(&(sem->p1)); }
}
else
{
for( i=0;i<10;i++) {
sem_post(&(sem->p2));
sem_wait(&(sem->p1));
display("Goodnight world\n");
sleep(1);}
}
sem_destroy(&(sem->p1));
sem_destroy(&(sem->p2));
return 0;
}
如您所见,我的问题是我不想按顺序显示,而是 randomly.So 我的输出是这样的。
Hello world
Goodnight world
Hello world
Goodnight world
Hello world
Goodnight world
....
相反,我希望进程不按顺序执行,因此输出将是这样的:
Hello world
Hello world
Hello world
Goodnight world
Hello world
Goodnight world
Goodnight world
....
这不会像您使用信号量那样发生。
导致输出混乱的整个问题(以及您一开始使用信号量的原因)是进程在其写入过程中被中断。
没有信号量,你有这个:
- 进程A开始打印"Hell"
- 进程A被中断;其他进程 运行
- 进程 B 最终获得共享时间并开始打印 "Good"
- 进程B被中断;其他进程 运行
- 进程 A 完成写入 "o world"
你当然知道这件事。您可以看到这如何导致输出被破坏。
重点是信号量如何改变这一点。当你到达第 3 点时,进程 B 将因为调用 sem_wait
而被阻塞(顺便说一句,你的 "process B" 没有正确处理信号量)。当进程 A 将信号量增加回 1 时,sem_post
将立即解锁进程 B 并让它继续,然后进程 A 可以回到循环的开头并再次 运行 sem_wait
。