PTHREAD_SPIN_INIT - Linux手册页

时间:2019-08-20 18:01:05  来源:igfitidea点击:

Linux程序员手册 第3部分
更新日期: 2020-06-09

名称

pthread_spin_init,pthread_spin_destroy-初始化或销毁旋转锁

语法

#include <pthread.h>

int pthread_spin_init(pthread_spinlock_t *lock, int pshared);
int pthread_spin_destroy(pthread_spinlock_t *lock);

编译并链接-pthread。

glibc的功能测试宏要求(请参阅feature_test_macros(7)):

pthread_spin_init(),pthread_spin_destroy():

_POSIX_C_SOURCE>= 200112L

说明

一般说明:大多数程序应使用互斥锁而不是自旋锁。自旋锁主要与实时调度策略结合使用。请参阅注释。

pthread_spin_init()函数分配使用锁所引用的旋转锁所需的任何资源,并将该锁初始化为处于解锁状态。 pshared参数必须具有以下值之一:

PTHREAD_PROCESS_PRIVATE
自旋锁只能由与调用pthread_spin_init()的线程处于同一进程的线程操作。 (尝试在进程之间共享自旋锁会导致未定义的行为。)
PTHREAD_PROCESS_SHARED
自旋锁可以由有权访问包含该锁的内存的任何进程中的任何线程操作(即,该锁可以在多个进程之间共享的共享内存对象中)。

在已经初始化的自旋锁上调用pthread_spin_init()会导致未定义的行为。

pthread_spin_destroy()函数会破坏先前初始化的自旋锁,从而释放为该锁分配的所有资源。销毁先前未初始化的自旋锁,或者在另一个线程持有该锁的同时销毁自旋锁会导致未定义的行为。

一旦自旋锁被破坏,对该锁执行任何操作,而不是再次使用pthread_spin_init()对其进行初始化,将导致未定义的行为。

对由锁引用的对象的副本执行诸如pthread_spin_lock(3),pthread_spin_unlock(3)和pthread_spin_destroy()之类的操作的结果是不确定的。

返回值

成功时,函数将返回零。失败时,它们返回错误号。如果pthread_spin_init()失败,则不会初始化锁定。

错误说明

pthread_spin_init()可能因以下错误而失败:

EAGAIN
系统没有足够的资源来初始化新的自旋锁。
ENOMEM
内存不足,无法初始化自旋锁。

版本

这些功能首先出现在2.2版的glibc中。

遵循规范

POSIX.1-2001。

对进程共享的自旋锁的支持是POSIX选项。该选项在glibc实现中受支持。

备注

自旋锁应与实时调度策略(SCHED_FIFO,或可能的SCHED_RR)结合使用。将自旋锁与不确定的调度策略(例如SCHED_OTHER)一起使用可能表示设计错误。问题是,如果在保持自旋锁的同时在CPU之外调度了根据这种策略操作的线程,则其他线程将浪费时间在锁上旋转,直到再次重新安排锁持有者并释放锁为止。

如果线程在使用自旋锁时产生死锁情况,那么这些线程将永远旋转,从而消耗CPU时间。

用户空间自旋锁不适用于一般的锁定解决方案。根据定义,它们倾向于优先级倒置和无限制的旋转时间。使用自旋锁的程序员不仅在代码上而且在系统配置,线程放置和优先级分配方面都必须格外小心。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/