zoukankan      html  css  js  c++  java
  • 上锁函数 pthread_mutex_lock

    锁定互斥锁

    使用 pthread_mutex_lock(3C) 可以锁定 mutex 所指向的互斥锁。

    pthread_mutex_lock 语法
    int	pthread_mutex_lock(pthread_mutex_t *mutex); 
    #include <pthread.h>
    
    
    
    pthread_mutex_t mutex;
    
    int ret;
    
    
    
    ret = pthread_ mutex_lock(&mp); /* acquire the mutex */

    pthread_mutex_lock() 返回时,该互斥锁已被锁定。调用线程是该互斥锁的属主。如果该互斥锁已被另一个线程锁定和拥有,则调用线程将阻塞,直到该互斥锁变为可用为止。 对于 Solaris 线程,请参见mutex_lock 语法

    如果互斥锁类型为 PTHREAD_MUTEX_NORMAL,则不提供死锁检测。尝试重新锁定互斥锁会导致死锁。如果某个线程尝试解除锁定的互斥锁不是由该线程锁定或未锁定,则将产生不确定的行为。

    如果互斥锁类型为 PTHREAD_MUTEX_ERRORCHECK,则会提供错误检查。如果某个线程尝试重新锁定的互斥锁已经由该线程锁定,则将返回错误。如果某个线程尝试解除锁定的互斥锁不是由该线程锁定或者未锁定,则将返回错误。

    如果互斥锁类型为 PTHREAD_MUTEX_RECURSIVE,则该互斥锁会保留锁定计数这一概念。线程首次成功获取互斥锁时,锁定计数会设置为 1。线程每重新锁定该互斥锁一次,锁定计数就增加 1。线程每解除锁定该互斥锁一次,锁定计数就减小 1。 锁定计数达到 0 时,该互斥锁即可供其他线程获取。如果某个线程尝试解除锁定的互斥锁不是由该线程锁定或者未锁定,则将返回错误。

    如果互斥锁类型是 PTHREAD_MUTEX_DEFAULT,则尝试以递归方式锁定该互斥锁将产生不确定的行为。对于不是由调用线程锁定的互斥锁,如果尝试解除对它的锁定,则会产生不确定的行为。如果尝试解除锁定尚未锁定的互斥锁,则会产生不确定的行为。

    pthread_mutex_lock 返回值

    pthread_mutex_lock() 在成功完成之后会返回零。其他任何返回值都表示出现了错误。如果出现以下任一情况,该函数将失败并返回对应的值。

    EAGAIN

    描述:

    由于已超出了互斥锁递归锁定的最大次数,因此无法获取该互斥锁。

    EDEADLK

    描述:

    当前线程已经拥有互斥锁。

    如果定义了 _POSIX_THREAD_PRIO_INHERIT 符号,则会使用协议属性值 PTHREAD_PRIO_INHERIT 对互斥锁进行初始化。此外,如果pthread_mutexattr_setrobust_np()robustness 参数是 PTHREAD_MUTEX_ROBUST_NP,则该函数将失败并返回以下值之一:

    EOWNERDEAD

    描述:

    该互斥锁的最后一个属主在持有该互斥锁时失败。该互斥锁现在由调用方拥有。调用方必须尝试使该互斥锁所保护的状态一致。

    如果调用方能够使状态保持一致,请针对该互斥锁调用 pthread_mutex_consistent_np() 并解除锁定该互斥锁。以后对pthread_mutex_lock() 的调用都将正常进行。

    如果调用方无法使状态保持一致,请勿针对该互斥锁调用 pthread_mutex_init(),但要解除锁定该互斥锁。以后调用pthread_mutex_lock() 时将无法获取该互斥锁,并且将返回错误代码 ENOTRECOVERABLE

    如果获取该锁的属主失败并返回 EOWNERDEAD,则下一个属主获取该锁时将返回 EOWNERDEAD

    ENOTRECOVERABLE

    描述:

    尝试获取的互斥锁正在保护某个状态,此状态由于该互斥锁以前的属主在持有该锁时失败而导致不可恢复。尚未获取该互斥锁。如果满足以下条件,则可能出现此不可恢复的情况:

    • 以前获取该锁时返回 EOWNERDEAD

    • 该属主无法清除此状态

    • 该属主已经解除锁定了该互斥锁,但是没有使互斥锁状态保持一致

    ENOMEM

    描述:

    已经超出了可同时持有的互斥锁数目的限制。

  • 相关阅读:
    JavaScript操作服务器控件之Gridview控件
    GridView_RowDataBound 常用方法
    GridView ,后台修改 跟新完毕,前端 未跟新处理
    怎么判断DropDownList是否选择值
    GridView.SelectedIndex
    DropDownlist数据SelectedIndexChanged触发问题解决
    error:将字符串转换为 uniqueidentifier 时失败
    UniqueIdentifier 数据类型
    在Sql2005中,向表中插入数据时遇到uniqueidentifier列,如何插入数据?
    mysql给id生成uuid
  • 原文地址:https://www.cnblogs.com/flyme/p/2145527.html
Copyright © 2011-2022 走看看