【问题标题】:How to use semaphores without thread and fork?如何在没有线程和分叉的情况下使用信号量?
【发布时间】:2021-08-18 16:37:07
【问题描述】:

我目前正在研究一个学校项目(C 语言),该项目旨在使可以一个一个写入共享内存的进程。 我不能使用多线程,也不能使用 fork。 我可以只有一个可执行文件,它必须运行任意多次。

例如,如果我这样做:./main john 然后./main toto,John 将能够在共享内存中写入,而 Toto 必须等待 John 解锁信号量。

但是我找不到任何文档可以清楚地解释它是如何工作的不做线程、分叉等。

有人可以帮助我吗?谢谢

【问题讨论】:

  • 搜索库pthread.h和semaphore.h,基本上你需要创建两个线程并将信号量放在临界区(线程可以共享一个公共变量)。如果你使用的是 Linux,你可以输入“man pthread”来获取库的手册。
  • 标题说没有线程
  • 如果可以通过sem_open 获取进程间信号量(如果必须通过semget)。或者获取一个独占的、咨询文件锁(fcntl(F_SETLK)/lockfflock)。您的教授可能不允许线程强制您考虑进程间同步,并且不允许(显式)分叉以防止您轻松继承进程间信号量(即,您必须重新获取它在每个过程中)。如果有问题请回到这里。祝你好运。

标签: c multithreading semaphore shared-memory


【解决方案1】:

假设使用Linux:

因为不允许多线程,你可以忽略 pthread-semaphores。 也许您正在寻找 system-V IPC 信号量:

https://man7.org/linux/man-pages/man7/sysvipc.7.html

那些可以在进程之间使用。

system-V IPC 还提供共享内存处理功能。

Posix-semaphores 和 shm API 也是另一种选择: https://linux.die.net/man/7/sem_overview https://man7.org/linux/man-pages/man7/shm_overview.7.html

【讨论】:

  • 作为一个小点,没有“pthread-semaphores”。 pthreads 本身有互斥体、条件变量、屏障和rwlocks,但没有信号量。虽然 <semaphore.h><pthread.h> 现在都是 POSIX Base 的一部分,但它们以前属于不同的选项组。
【解决方案2】:

https://opensource.com/article/19/4/interprocess-communication-linux-storage 提供了使用 POSIX 信号量来同步共享内存访问的示例(在该文章的第二部分,文件锁定示例之后)。

它与同步线程没有什么不同,只是它使用操作系统工具进行进程间通信。

POSIX 信号量可用于 POSIX 系统,尤其是许多 *nix。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    相关资源
    最近更新 更多