gpt4 book ai didi

c - 使用 POSIX 计数信号量作为二进制信号量

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:38 24 4
gpt4 key购买 nike

我正在尝试将 POSIX 计数信号量 用作二进制信号量

为此,我编写了如下代码

sem = sem_open(argv[optind], flags, perms, 1); // Initialising semaphore to 1

while(sem_getvalue(sem) > 0)
{
continue;

}
sem_post(sem);

还有其他方法可以将计数信号量用作二进制信号量吗?在这里,如果在 while lopp 被评估为 false 之后立即发生 comtext 切换,但尚未调用 sem_post,在这种情况下不会导致竞争条件吗?对于我想要实现的目标,还有其他更好的解决方案吗?

我有多个进程与信号量同步。我知道这段代码不能保证一个场景,在 sem_getvalue 期间,即使 sem 值变为零,甚至在调用特定进程中的 sem_post 之前,另一个进程也可能调用 sem_post,导致值成为 2. 如何解决这种情况。

我的问题不会通过互斥锁解决,因为在我的问题中,有些进程仅用于信号,即 sem_post 操作,这与互斥锁不同,在互斥锁中,所有进程都将具有不断等待和发出信号

最佳答案

您发布的代码存在一些问题。

while(sem_getvalue(sem) > 0)

这称为忙等待,这意味着进程在信号量上自旋并且不会将 CPU 交给调度程序。通常,只有在等待时间小于上下文切换时间(例如低延迟)的情况下才会进行忙等待。

下一个问题是你的语义被颠倒了。当信号量大于 0 时,您递减并继续。此外,您的调用不是原子的,这会引入许多竞争条件。

实际上,您需要互斥语义,因为只有两种状态(0/锁定和 1/解锁)。为此,您可以保证 sem_post 永远不会进行 sem_wait,或者您可以使用文件锁。

const char* lock_file = ".lock";

const int fd_lock = open(lock_file, O_CREAT);

flock(fd_lock, LOCK_EX);

// do stuff

flock(fd_lock, LOCK_UN);

// do more stuff

close(fd_lock);
unlink(lock_file);

POSIX 变体将涉及 fcntl 而不是 flock

关于c - 使用 POSIX 计数信号量作为二进制信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32163170/

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