如果你想实现这种信号量访问(这通常是进行 IPC 所需的),你可以做的一件事是创建共享内存,它只是一个 int。在进程之间使用此 int 作为信号量的值。你可以编写包装函数,使用它来执行你想要的操作(如读写操作),或者直接使用共享内存。在这种情况下,我不会太担心竞争条件,因为共享内存只是一个 int。如果你担心竞争条件,用于执行信号量操作的包装函数实际上可以使用信号量来消除任何竞争条件。此外,以这种方式执行的一个额外好处是你可以检查 int 的值。
(PHP 4, PHP 5, PHP 7, PHP 8)
sem_release — 释放信号量
如果你想实现这种信号量访问(这通常是进行 IPC 所需的),你可以做的一件事是创建共享内存,它只是一个 int。在进程之间使用此 int 作为信号量的值。你可以编写包装函数,使用它来执行你想要的操作(如读写操作),或者直接使用共享内存。在这种情况下,我不会太担心竞争条件,因为共享内存只是一个 int。如果你担心竞争条件,用于执行信号量操作的包装函数实际上可以使用信号量来消除任何竞争条件。此外,以这种方式执行的一个额外好处是你可以检查 int 的值。
sem_release 只能释放当前被调用进程获取的信号量这一事实实际上是一个错误,因为有时(例如在读写器实现中)需要释放另一个进程获取的信号量。在 C 中你可以做到这一点。
我之所以告诉你这一点,是因为我正在尝试用 PHP3 编写一个聊天应用程序,它由两个程序组成:一个监听器和一个发言者。发言者释放一个信号量以通知在共享内存变量中有一个新消息。监听器在输出消息之前会在该信号量中等待。