我正在使用自旋锁来保护一个非常小的关键部分。争用很少发生,因此自旋锁比常规互斥锁更合适。
我当前的代码如下,并假设 x86 和 GCC:
volatile int exclusion = 0;
void lock() {
while (__sync_lock_test_and_set(&exclusion, 1)) {
// Do nothing. This GCC builtin instruction
// ensures memory barrier.
}
}
void unlock() {
__sync_synchronize(); // Memory barrier.
exclusion = 0;
}
所以我想知道:
- 这段代码正确吗?它是否正确地确保了互斥?
- 它适用于所有 x86 操作系统吗?
- 它也适用于 x86_64 吗?在所有操作系统上?
- 是最优的吗?
- 我见过使用比较和交换的自旋锁实现,但我不确定哪个更好。
- 根据 GCC atomic builtins 文档(http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html),还有
__sync_lock_release
. 我不是记忆障碍方面的专家,所以我不确定我是否可以使用它而不是__sync_synchronize
. - 我正在针对没有争用的情况进行优化。
我根本不在乎争吵。可能有 1 个,也可能有 2 个其他线程试图每隔几天锁定一次自旋锁。