Захват и освобождение спинлока

Захват и освобождение спинлока

int pthread_spin_lock(pthread_spinlock_t* spinner);

int pthread_spin_trylock(pthread_spinlock_t* spinner);

Это функции захвата и попытки захвата крутящейся блокировки соответственно. Как и для мьютекса, если объект spinner в момент захвата свободен, то поток, вызвавший одну из этих функций, становится владельцем крутящейся блокировки. Если spinner уже захвачен другим потоком, то в случае вызова второй из рассматриваемых функций управление возвращается немедленно, а в случае простого захвата (первая функция) вызвавший поток «крутится», то есть остается активным, но не возвращает управления до тех пор, пока объект синхронизации не освободится.

Попытка повторного захвата крутящейся блокировки из того же потока приводит к мертвой блокировке.

Функции возвращают следующие параметры:

EOK — успешное выполнение;

EAGAIN — недостаточно ресурсов системы для захвата spinner;

EDEADLK — вызвавший поток уже владеет spinner;

EINVAL — spinner — неверный объект типа pthread_spinlock_t;

EBUSY — объект захвачен другим потоком (для pthread_spin_trylock()).

int pthread_spin_unlock(pthread_spinlock_t* spinner);

Вызов этой функции освобождает объект крутящейся блокировки, на который указывает аргумент spinner.

Функция может возвращать значения:

EOK — успешное выполнение;

EINVAL — неверный объект spinner;

EPERM — вызывающий поток не является владельцем крутящейся блокировки.

Данный текст является ознакомительным фрагментом.