有什么方法可以更好更快地创建临界区?
在 sem_wait 和 sem_post 之间使用二进制信号量。
或者使用原子操作:
#include <sched.h>
void critical_code(){
static volatile bool lock = false;
//Enter critical section
while ( !__sync_bool_compare_and_swap (&lock, false, true ) ){
sched_yield();
}
//...
//Leave critical section
lock = false;
}
最佳答案
无论您使用什么方法,代码最糟糕的性能问题与您使用的锁类型无关,而是您锁定的是代码而不是数据。
话虽如此,没有理由像那样滚动自己的自旋锁。如果你想要一个自旋锁,要么使用 pthread_spin_lock
,要么使用 pthread_mutex_lock
或 sem_wait
(使用二进制信号量)竞争时的其他过程。您编写的代码在使用 sched_yield
方面是两全其美。对 sched_yield
的调用将确保锁在同时存在锁争用和 cpu 负载的情况下至少等待几毫秒(可能是整个调度时间片),并且它会在以下情况下消耗 100% 的 cpu存在争用但没有 CPU 负载(例如,由于锁持有者在 IO 中被阻塞)。如果你想获得自旋锁的任何好处,你需要在不进行任何系统调用的情况下进行自旋。如果你想获得 cpu 的任何好处,你应该使用适当的同步原语,它将使用(在 Linux 上)futex
(或等效的)操作来精确地产生直到锁可用 - 不更短,不再。
如果碰巧所有这些都让你头疼,甚至不要考虑编写自己的锁..
关于c - 实现临界区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9066990/