【发布时间】:2022-01-14 02:00:20
【问题描述】:
我正在制作一种方式的聊天程序。 但是在客户端程序中,它运行得非常快,所以它向我显示了很多文本。 所以我正在使用 System V 信号量,但它不能使用 sem_wait 我应该使用 POSIX 信号量来像 sem_wait 一样使用吗?
我不会写睡眠。因为我要单独发送大量文件。
【问题讨论】:
-
最好使用 POSIX 信号量,因为调用比 System V 信号量简单得多。
我正在制作一种方式的聊天程序。 但是在客户端程序中,它运行得非常快,所以它向我显示了很多文本。 所以我正在使用 System V 信号量,但它不能使用 sem_wait 我应该使用 POSIX 信号量来像 sem_wait 一样使用吗?
我不会写睡眠。因为我要单独发送大量文件。
【问题讨论】:
是的,有...但是当您将信号量减到 0 以下时会发生这种情况。Sys V 信号量是 Dijkstra 信号量的一种变体,您可以在其中对一组信号量按顺序执行一组操作 原子地,所以如果它们中的任何一个阻塞了您请求的操作,您将等待。正如您可能知道的那样,当您将信号量的值减小到 0 以下时,信号量会等待(阻塞),并且只有当它再次高于 0 时,它才允许阻塞的进程通过。在 SysV 中,您可以对单个信号量进行递增或递减(如果您只处理一个,并且只递减 1,则该操作将等效于 P() Dijkstra 的调用,而如果您按 N 执行此操作,则该操作将等于 N 次按顺序调用 P()(并且是原子的,由 Unix 内核保证)递增操作等价于 V() Dijkstra 的调用,并且也是以原子方式完成的。内核还维护净量 a进程对信号量进行了操作,以便撤消该进程对信号量所做的所有操作,以防该进程终止。
我希望这已经回答了你的问题。
【讨论】:
对 System V IPC 信号量集进行操作的函数是 semop()。如果信号量集有多个成员,它可以在一次调用中同时执行等待和信号操作。
macOS 手册说:
#include <sys/sem.h> int semop(int semid, struct sembuf *sops, size_t nsops);描述
semop()系统调用以原子方式在semid指示的信号量集上执行sops指示的操作数组。sops的长度由nsops表示。每个操作都编码在一个struct sembuf中,其定义如下:struct sembuf { u_short sem_num; /* semaphore # */ short sem_op; /* semaphore operation */ short sem_flg; /* operation flags */ };
它继续详细说明行为。
【讨论】: