【问题标题】:independent execution of processes with semaphores使用信号量独立执行进程
【发布时间】:2016-12-03 16:48:19
【问题描述】:

我使用信号量为一个 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;

}

如您所见,我的问题是我不想让显示按顺序排列,而是随机显示。所以我的输出是这样的。

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
  ....

【问题讨论】:

标签: c process semaphore shared


【解决方案1】:

这不会像您使用信号量那样发生。

导致输出混乱的整个问题(以及您开始使用信号量的原因)是一个进程在其写入过程中被中断。

没有信号量,你有这个:

  1. 进程 A 开始打印“地狱”
  2. 进程 A 被中断;其他进程运行
  3. 进程 B 最终获得共享时间并开始打印“Good”
  4. 进程 B 被中断;其他进程运行
  5. 进程 A 完成写入“o world”

你当然知道这一点。你可以看到这是如何导致输出被破坏的。

关键是信号量如何改变这一点。当您到达第 3 点时,进程 B 将因为调用 sem_wait 而被阻塞(顺便说一句,您的“进程 B”没有正确处理信号量)。当进程 A 将信号量增加到 1 时,sem_post 将立即解锁进程 B 并让它继续运行,然后进程 A 才能回到循环的开头并再次运行 sem_wait

【讨论】:

  • 也许我不够清楚。我想使用信号量完成的事情不是打印让我们说第一个显示然后第二个然后第一个等等 10 次。我想显示整个行 Hello world 和整行晚安世界,但顺序随机。例如,第一次显示一次,然后第二次显示 3 次,然后第一次显示 2 次,等等
  • 不,你说的够清楚了!我回答了你的问题。当一个进程将信号量增加到 1 时,另一个进程立即解除阻塞。所以你总是会按顺序得到“Hello world”和“Goodnight world”。
  • 有什么想法可以用这段代码完成我想要的事情吗?或者我应该改用一种全新的不同方法。感谢您的帮助
  • 当您使用信号量时,您通过两个进程竞争获得的随机性几乎消失了。因此,您必须故意将随机性合并回您的代码中。例如,您可以添加第二个信号量来控制一个受保护的内存区域,该区域说明谁应该是下一个要打印的进程。每次打印某个进程时,它们都会在其中写入一个随机值。
猜你喜欢
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多