侧边栏壁纸
博主头像
noerror

虚灵不寐,众理具而万事出。

  • 累计撰写 238 篇文章
  • 累计创建 9 个标签
  • 累计收到 2 条评论
标签搜索

目 录CONTENT

文章目录

pthread_spin_init函数用法详解

noerror
2022-10-04 / 0 评论 / 0 点赞 / 34 阅读 / 885 字 / 正在检测是否收录...

pthread_spin_init函数用法详解

pthread_spin_init函数简介

  • 头文件包含
#include <pthread.h>
  • 函数定义
int pthread_spin_init(pthread_spinlock_t * lock , int  pshared );
int pthread_spin_destroy(pthread_spinlock_t * lock );
  • 编译链接选项
-pthread

pthread_spin_init函数常见使用错误

  • 链接错误
    undefined reference to `pthread_spin_init'
    解决办法:添加链接选项
-pthread
  • 编译错误
    warning: implicit declaration of function ‘pthread_spin_init’ [-Wimplicit-function-declaration]
    解决办法:包含头文件
#include <pthread.h>

pthread_spin_init函数详细描述

大多数程序应该使用互斥锁而不是自旋锁。自旋锁主要与实时调度策略结合使用。见注释。
pthread_spin_init ()函数分配使用lock引用的自旋锁所需的任何资源,并将锁初始化为解锁状态。pshared参数必须具有以下值之一:

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

在已经初始化的自旋锁上调用pthread_spin_init ()会导致未定义的行为。
pthread_spin_destroy ()函数破坏以前初始化的自旋锁,释放为该锁分配的任何资源。破坏以前未初始化的自旋锁或在另一个线程持有该锁时破坏自旋锁会导致未定义的行为。
一旦一个自旋锁被销毁,除了再次用pthread_spin_init ()初始化它之外,对该锁执行任何操作都会导致未定义的行为。
对lock引用的对象的copies执行诸如pthread_spin_lock (3)、pthread_spin_unlock (3)和pthread_spin_destroy ()等操作的结果是未定义的。

pthread_spin_init函数返回值

成功后,函数返回零。失败时,它们返回一个错误号。在pthread_spin_init ()失败的情况下,锁不会初始化。

pthread_spin_init函数错误码

pthread_spin_init ()可能会失败,出现以下错误:

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

pthread_spin_init函数其他说明

自旋锁应该与实时调度策略结合使用,( SCHED_FIFO 或可能的SCHED_RR )使用自旋锁与不确定的调度策略结合使用,例如SCHED_OTHER可能表明设计错误。问题是,如果在这样一个策略下运行的线程在它持有一个旋转锁的同时在CPU外调度,那么其他线程将浪费时间在锁上旋转,直到锁持有者再次被重新调度并释放锁。
如果线程在使用自旋锁时产生死锁情况,那么这些线程将永远自旋,消耗CPU时间。
用户空间自旋锁是not作为一个通用的锁定解决方案。根据定义,它们容易出现优先级反转和无界自旋时间。使用自旋锁的程序员不仅在代码中必须格外小心,而且在系统配置、线程放置和优先级分配方面也必须格外小心。

0

评论区