条件变量属性
使用条件变量可以以原子方式阻塞线程,直到某个特定条件为真为止。条件变量始终
与互斥锁一起使用。
使用条件变量,线程可以以原子方式阻塞,直到满足某个条件为止。对条件的测试是
在互斥锁(互斥)的保护下进行的。
如果条件为假,线程通常会基于条件变量阻塞,并以原子方式释放等待条件变化的互
斥锁。如果另一个线程更改了条件,该线程可能会向相关的条件变量发出信号,从而
使一个或多个等待的线程执行以下操作:
■ 唤醒
■ 再次获取互斥锁
■ 重新评估条件
在以下情况下,条件变量可用于在进程之间同步线程:
■ 线程是在可以写入的内存中分配的
■ 内存由协作进程共享
调度策略可确定唤醒阻塞线程的方式。对于缺省值SCHED_OTHER
,将按优先级顺序唤醒
线程。
必须设置和初始化条件变量的属性,然后才能使用条件变量。
初始化条件变量属性
使用pthread_condattr_init(3C)
可以将与该对象相关联的属性初始化为其缺省值。在
执行过程中,线程系统会为每个属性对象分配存储空间。
pthread_condattr_init
语法
int pthread_condattr_init(pthread_condattr_t *cattr);
#include <pthread.h>
pthread_condattr_t cattr;
int ret;
/* initialize an attribute to default value */
ret = pthread_condattr_init(&cattr);
调用此函数时,pshared 属性的缺省值为PTHREAD_PROCESS_PRIVATE
。pshared 的该值表示
可以在进程内使用已初始化的条件变量。
cattr 的数据类型为opaque,其中包含一个由系统分配的属性对象。cattr 范围可能的值
为PTHREAD_PROCESS_PRIVATE
和PTHREAD_PROCESS_SHARED
。PTHREAD_PROCESS_PRIVATE
是
缺省值。
条件变量属性必须首先由pthread_condattr_destroy(3C)
重新初始化后才能重用。
pthread_condattr_init()
调用会返回指向类型为opaque 的对象的指针。如果未销毁该
对象,则会导致内存泄漏。
pthread_condattr_init
返回值
pthread_condattr_init()
在成功完成之后会返回零。其他任何返回值都表示出现了错
误。如果出现以下任一情况,该函数将失败并返回对应的值。
ENOMEM
描述: 分配的内存不足,无法初始化线程属性对象。
EINVAL
描述: cattr 指定的值无效。
删除条件变量属性
使用pthread_condattr_destroy(3C)
可以删除存储并使属性对象无效。
pthread_condattr_destroy
语法
int pthread_condattr_destroy(pthread_condattr_t *cattr);
#include <pthread.h>
pthread_condattr_t cattr;
int ret;
/* destroy an attribute */
ret = pthread_condattr_destroy(&cattr);
pthread_condattr_destroy
返回值
pthread_condattr_destroy()
在成功完成之后会返回零。其他任何返回值都表示出现了
错误。如果出现以下情况,该函数将失败并返回对应的值。
EINVAL
描述: cattr 指定的值无效。
设置条件变量的范围
pthread_condattr_setpshared(3C)
可用来将条件变量的范围设置为进程专用(进程
内)或系统范围内(进程间)。
pthread_condattr_setpshared
语法
int pthread_condattr_setpshared(pthread_condattr_t *cattr,
int pshared);
#include <pthread.h>
pthread_condattr_t cattr;
int ret;
/* all processes */
ret = pthread_condattr_setpshared(&cattr, PTHREAD_PROCESS_SHARED);
/* within a process */
ret = pthread_condattr_setpshared(&cattr, PTHREAD_PROCESS_PRIVATE);
如果pshared 属性在共享内存中设置为PTHREAD_PROCESS_SHARED
,则其所创建的条件变
量可以在多个进程中的线程之间共享。此行为与最初的Solaris 线程实现中
mutex_init()
中的USYNC_PROCESS
标志等效。
如果互斥锁的pshared 属性设置为PTHREAD_PROCESS_PRIVATE
,则仅有那些由同一个进程
创建的线程才能够处理该互斥锁。PTHREAD_PROCESS_PRIVATE
是缺省值。
PTHREAD_PROCESS_PRIVATE
所产生的行为与在最初的Solaris 线程的cond_init()
调用中
使用USYNC_THREAD
标志相同。PTHREAD_PROCESS_PRIVATE
的行为与局部条件变量相同。
PTHREAD_PROCESS_SHARED
的行为与全局条件变量等效。
pthread_condattr_setpshared
返回值
pthread_condattr_setpshared()
在成功完成之后会返回零。其他任何返回值都表示出
现了错误。如果出现以下情况,该函数将失败并返回对应的值。
EINVAL
描述: cattr 或pshared 的值无效。
获取条件变量的范围
pthread_condattr_getpshared(3C)
可用来获取属性对象cattr 的pshared 的当前值。
pthread_condattr_getpshared
语法
int pthread_condattr_getpsh