【问题标题】:Trouble understanding named semaphore initialization难以理解命名信号量初始化
【发布时间】:2020-09-14 14:34:19
【问题描述】:

我需要使用命名信号量在线程之间共享资源。我有一个主线程和 X 个子线程。

我是否必须在主线程中使用sem_openO_CREAT 标志,然后在每个子线程中再次调用sem_open,名称相同但没有标志?

还是我只需要在我的主线程中调用一次sem_open,然后在所有子线程中使用它的返回值?

我都尝试了,但没有得到任何接近预期的行为...

【问题讨论】:

  • 您可以使用未命名的信号量,它们只是在线程之间共享;见sem_init
  • 我知道我应该使用它们,但这是一个学校项目,必须使用命名信号量
  • 后者,但仅仅知道这对您没有帮助。请告诉我们您遇到的问题的minimal reproducible example
  • 命名信号量的正常用例将在不同的进程之间。在这种情况下,每个进程将独立打开信号量,并且每个进程都有自己的单独句柄。您确定讲师希望您在单个进程中使用多个线程吗?
  • 我们必须执行两次相同的程序,一次使用不同的进程,另一次在同一进程中但使用不同的线程。我们必须对它们都使用命名信号量

标签: c multithreading semaphore


【解决方案1】:

打开信号量后,您必须在线程中使用等待和信号函数:

sem_open(3) 函数创建一个新的命名信号量或 打开现有的命名信号量。信号量有后 已打开,可以使用 sem_post(3) 和 sem_wait(3)。当一个进程完成使用信号量时, 它可以使用 sem_close(3) 关闭信号量。当所有 进程已完成使用信号量,可以将其删除 从系统使用 sem_unlink(3)。

参考:sem_overview(7) — Linux manual page

【讨论】:

  • 我使用这个手册页来编写我的代码,但是为什么要使用信号并等待?
  • 信号量只是整数值,它减少和增加原子操作,使您能够在关键部分执行功能。初始值为 1(或您必须设置),当您调用 wait 时,它会转换为零。现在另一个函数调用等待首先检查它是否大于 0。如果为 0,则等待。您需要在进程结束时调用信号将值从 0 更改为 1,然后其他进程才能启动。
  • 我想你说的是sem_waitsem_post 函数,我已经在使用了
  • 它们具有相同的功能,但名称不同!你打开后给他们打电话了吗?
  • 好吧,我不知道!是的,我的错误不在这里......我现在开始工作了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多