Я использую спин-блокировку для защиты очень маленького критического раздела. Конфликт случается очень редко, поэтому блокировка спина более уместна, чем обычный мьютекс.
Мой текущий код выглядит следующим образом и предполагает 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 (http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html) также
__sync_lock_release
. Я не специалист по барьерам памяти, поэтому я не уверен, что для меня это использовать вместо__sync_synchronize
. - Я оптимизирую для случая, в котором нет конкуренции.
Меня не волнует спор. Может быть, 1, может быть, 2 других потока, пытающихся заблокировать блокировку спина один раз в несколько дней.