gpt4 book ai didi

正确删除多个进程使用的 SYS V 信号量

转载 作者:太空宇宙 更新时间:2023-11-04 04:51:53 26 4
gpt4 key购买 nike

我有一个项目,我必须在其中使用 SYS V 信号量。我有几个进程共享一个信号量(使用相同的 key )并使用以下代码对其进行初始化:

bool semaphore_init(semaphore_id_t* sem, int sem_value, key_t key)
{
/* Try to get a semaphore, to check if you will be an owner */
*sem = semget(key, 1, IPC_CREAT | IPC_EXCL | 0666);
if (*sem == -1)
{
if (errno == EEXIST)
{
/* We are not owners, get semaphore without exclusive flag */
*sem = semget(key, 1, IPC_CREAT | 0666);
if (*sem == -1) return false;
}
else return false;
}
else
{
/* We are owners, initialize semaphore */
int return_value = semctl(*sem , 0, SETVAL, sem_value);
if (return_value == -1) return false;
}

return true;
}

我的问题是:当所有使用它的进程都将终止时,我想删除这个信号量。使用:

semctl(*sem, 0, IPC_RMID)

不是一个选项。它会立即删除信号量,其他进程会出现未定义的行为。我只是找不到使用 SYS V API 的正确方法。

最佳答案

您可以使用引用计数。只需让每个进程在信号量初始化后递增 ref 计数器,并在进程终止时递减它。最后一个将它减为 0 的也将删除它,或者让主进程在知道所有其他进程已终止时清理它。

您可能还需要另一个锁定机制来同步对引用计数器的访问,您可能会在产生并等待其他进程的主进程中创建/删除它。

此外,如果您的进程可能异常终止,请注意悬挂引用。

关于正确删除多个进程使用的 SYS V 信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14359753/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com