【问题标题】:Parallel processes using semaphores in C在 C 中使用信号量的并行进程
【发布时间】:2015-04-21 21:16:40
【问题描述】:

我对 C 中的信号量有一个大问题。这是我的代码灵感的链接:http://cse.unl.edu/~ylu/csce351/notes/Solution%20for%20Building%20H2O.pdf

氢和氧有两个相似的代码。这就是想法:氧气和氢气会产生一些过程,它们是在不同的时间产生的。当有 2 个氢和 1 个氧时,它们调用函数bond()。但他们必须等他们。在条件被评估为假后,它应该切换到另一个进程(或者至少我是这样理解的)。但是在我的代码中,它继续执行下一个命令,这导致它不会等待我需要的所有进程。即使它应该等待,它也会在创建的每个进程之后打印到输出。有谁知道那里出了什么问题?

(如果这还不够,我可以发布更多代码。)

氧气代码:(氢气类似)

sem_wait(mutex);
if ((*hydrogen >=2) && (*oxigen>=1))
{
    (*count_c)++;
    *count_cur_h-=2;
    sem_post(hydrel);
    sem_post(hydrel);
    *count_cur_o-=1;
    sem_post(oxrel);
}
else
{
    (*count_c)++;
    sem_post(mutex);   // This is the place where it is supposed
                       // to release and continue to another process,
                       // but it goes to the next command.
}

sem_wait(oxrel);
bond();
sem_wait(barrier);

//semaphores are initialized like this:
sem_init(mutex,1,1);
sem_init(oxrel,1,1);
sem_init(hydrel,1,2);
sem_init(barrier,1,3);

【问题讨论】:

  • 你如何定义这些互斥体,它们在哪里?它们应该位于共享内存中,因为您正在创建进程之间共享的互斥锁。另外,当你在评论中说继续另一个进程时,你的意思是唤醒另一个进程(等待mutex)吗?另一件事是,您获得了互斥锁,但仅在 else 条件下才释放它。这是预期的行为吗?
  • 信号量在共享内存中。我的意思是一直等到不会有2个氢和氧。应该是有意的行为-当您查看链接时,有相同的东西(在我们学校项目中用作参考的“信号量小书”中也有相同的东西)
  • 另外,barrier 在您的代码中发布在哪里?您链接中的代码使用mutex.signal() 而不是您的代码使用的barrier.wait()。另一个注意事项:sem_post 不会切换到另一个进程,调用者将继续运行。链接中的代码似乎依赖于 mutex-acquiring 来停止当前进程。
  • 在bond函数中解除了障碍。是的,它使用了barrier.wait,但这只是一个插件。我发布的这段代码用于氧气,氢气的代码使用 mutex.signal()。我知道它不会切换到另一个进程,但它应该释放进程(我认为)。

标签: c semaphore


【解决方案1】:

sem_post 不是阻塞调用。 sem_wait 是阻塞调用。如果调用 sem_wait 时 semaphore 的值为零,则调用它的函数将阻塞。 sem_post 用于释放另一个在 sem_wait 信号量值为零时阻塞等待的线程,但它确实阻塞自身。 sem_post 调用用于“唤醒等待 sem-wait 的线程”,然后继续向前,然后两个线程将同时运行(如果您至少有 2 个逻辑 CPU)。如果您希望调用 sem_post 的线程此时阻塞,您将需要执行其他操作(例如添加另一个信号量)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 2015-04-13
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 2019-05-28
    相关资源
    最近更新 更多