关于线程同步里面的函数解析

 一、有关互斥锁的函数

  1、 int pthread_mutex_init(pthread_mutex_t  *mutex,  const pthread_mutexattr_t *mutexattr);//初始化一个互斥锁

  2、int pthread_mutex_lock(pthread_mutex_t *mutex);//用于锁定给定的互斥锁。

  如果互斥锁当前已解锁,则它将被调用线程锁定并拥有,并且 pthread_mutex_lock 立即返回。

  如果互斥锁已被另一个线程锁定,则 pthread_mutex_lock 将挂起调用线程,直到互斥锁被解锁。  

  如果互斥锁已被调用线程锁定则行为取决于互斥锁的类型。 如果互斥锁是"fast"类型,则调用线程将被挂起,

  直到互斥锁被解锁,从而有效地导致调用线程死锁。 如果互斥锁属于 "error checking" 类型,则 pthread_mutex_lock

  会立即返回错误代码 EDEADLK。 如果互斥锁是"recursive" 类型,则 pthread_mutex_lock 成功并立即返回,记录调用

  线程锁定互斥锁的次数

  3、int pthread_mutex_trylock(pthread_mutex_t *mutex);//和上一个函数的功能相同

  区别在于如果互斥锁已被另一个线程(或者在"fast"互斥锁的情况下由调用线程)锁定,则它不会阻塞调用线程。

  相反,pthread_mutex_trylock 会立即返回错误代码。

  4、int pthread_mutex_unlock(pthread_mutex_t *mutex);//解锁给定的互斥锁

  如果互斥锁属于"fast"类型,则 pthread_mutex_unlock 将返回解锁状态。 如果它是"recursive"类型,则减少互斥锁

  的锁定计数(由调用线程对其执行的 pthread_mutex_lock 操作的数量),并且仅当该计数达到零时,互斥锁才真正解锁。

  在"error checking"和"recursive"互斥锁上,pthread_mutex_unlock 实际上在运行时检查互斥锁是否在入口处被锁定,

  并且它被现在调用 pthread_mutex_unlock 的同一线程锁定。 如果不满足这些条件,则返回错误代码并且互斥锁

  保持不变。 "Fast"互斥锁不执行此类检查,因此允许锁定的互斥锁由其所有者以外的线程解锁。 这是不可移植的行为,

  不得依赖。

   5、int pthread_mutex_destroy(pthread_mutex_t *mutex);//破坏互斥对象

  pthread_mutex_destroy 函数用于破坏互斥对象,释放它可能拥有的资源。 必须在入口处解锁互斥锁。

  在 LinuxThreads 实现中,没有资源与互斥对象关联,因此除了检查互斥锁是否已解锁外,pthread_mutex_destroy

  实际上什么都不做。

  对于快速互斥锁pthread_mutex_t类型的变量也可以使用常量PTHREAD_MUTEX_INITIALIZER

  对于递归互斥锁pthread_mutex_t类型的变量也可以使用常量PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP

  对于错误检查互斥锁pthread_mutex_t类型的变量也可以使用常量PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP

  mutexattr 中指定的互斥锁属性来初始化 mutex 指向的互斥锁对象,如果mutexattr为空即NULL,则使用默认属性。
二、有关条件变量的函数

  1、 int    pthread_cond_init(pthread_cond_t    *cond,    pthread_condattr_t  *cond_attr);//初始化条件变量

   当参数cattr为空指针时,函数创建的是一个缺省的条件变量。否则条件变量的属性将cattr中的属性值来决定。调用

   pthread_cond_init函数时,参数cattr为空指针等价于cattr中属性为缺省属性,只是前者不需要cattr所占用的内存开销。

   这个函数返回时,条件变量被存放在参数cond指向的内存中。

  2、 int pthread_cond_signal(pthread_cond_t *cond);//解除在条件变量上的阻塞

   函数被用来释放被阻塞在指定条件上的一个线程。

   必须在互斥锁的保护下使用新相应的条件变量。否则对条件变量的解锁有可能发生在锁定条件变量之前,从而造成死锁。

   唤醒阻塞在条件变量上的所有线程的顺序由调度策略决定,如果线程的调度策略是SCHED_OTHER类型的,系统将根据

   线程的优先级唤醒线程。

  如果没有线程被阻塞在条件变量上,那么调用pthread_cond_signal()将没有作用。

  3、int pthread_cond_broadcast(pthread_cond_t *cond);//释放阻塞的所用线程

   函数唤醒所用被pthread_cond_wait函数阻塞在某个条件变量上的线程,参数cond被用来指定这个条件变量。当没有线程

  阻塞在这个条件变量上时,pthread_cond_broadcast函数无效。

  4、int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);//阻塞在条件变量上

    函数将解锁mutex参数指向的互斥锁,并使当前线程阻塞在cond参数执行的条件变量上。

   被阻塞线程可以被pthread_cond_signal函数,pthread_cond_bradcast函数唤醒,也可能在被信号中断后唤醒。

   pthread_cond_wait函数的返回并不意味着条件的值一定发生了变化,必须重新检查条件的值。

   pthread_cond_wait函数返回时,相应的互斥锁将被当前线程锁定,即使函数出错返回。

   一般一个条件表达式都是在一个互斥锁的保护下被检查。当条件表达式为被满足时,线程将仍然阻塞在这个条件变量上。

   当另一个线程改变了条件的值并向条件变量发出信号时,等待在这个条件变量上的一个线程或所有线程都被唤醒,接着

   都试图在此占有相应的互斥锁。

   阻塞在条件变量上的线程被唤醒后,直到pthread_cond_wait()函数返回之前条件的值都有可能发生变化。所以函数返回

   以后,在锁定想应的互斥锁之前,必须重新测试条件值。

  5、int   pthread_cond_timedwait(pthread_cond_t   *cond,    pthread_mutex_t  *mutex, const struct

      timespec *abstime);//阻塞到指定时间

  函数到了一定的时间,即使条件外未发生也会解除阻塞。这个时间由参数abstime指定。函数返回时,相应的互斥锁往往

  是锁定的,即使是函数出错返回

  6、int pthread_cond_destroy(pthread_cond_t *cond);//释放条件变量
  
     






  
       

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值