是否可以有一组信号量?

is it possible to have an array of semaphores?

我正在研究哲学家就餐问题,我正在尝试创建一种方法来跟踪共享资源(叉子)。所以我的想法是创建一个信号量数组,这样当我不得不用叉子离开时,我可以通过使用数组中的索引来跟踪哲学家的编号和他吃饭的叉子,这个索引最好包含资源。

所以我的问题是,这可能吗?我尝试的一切都导致了错误,例如:

char ** sems[5];
sems[0] = struct sembuf a[1] = {{0, 1, 0}};
sems[1] = struct sembuf b[1]
sems[2] = struct sembuf c[1].... and so forth

但这显然是不正确的方法。有人可以帮我指出正确的方向吗? .

是的,有可能,cf Arrays of semaphore and mutual assignment in C

linux中有两种信号量:SystemV和POSIX信号量(https://www.tutorialspoint.com/inter_process_communication/inter_process_communication_system_v_posix.htm)

SystemV (sem.h)

内核内置信号量数组存在于使用 SysVinit 作为初始化系统 (SystemV) 的发行版中,参见 https://serverfault.com/questions/312982/what-are-the-semaphore-arrays-on-linux

有一个来自 SystemV (sem.h) 的旧信号量库,其中存在一个函数 GETALL 将所有信号量写入数组

semctl(semid, 2, GETALL, outarray);How semaphore operations are done for parent & child processes?

POSIX (semaphores.h)

信号量在内核 (Ring 0) 中维护,它们存储在 /dev 文件系统中,参见 https://man7.org/linux/man-pages/man7/sem_overview.7.html and https://unix.stackexchange.com/questions/275650/where-is-a-named-semaphore-stored

您可以使用 sem_overview()(命名信号量)和 shm_overview()(未命名信号量)

获得所有信号量的概览