使用条件变量(多线程编程笔记)

本文详细介绍了条件变量在多线程编程中的应用,包括初始化、设置属性、阻塞与解除阻塞线程、定时等待以及销毁条件变量等关键操作。条件变量与互斥锁结合,使得线程能够原子性地释放锁并在特定条件满足时恢复执行,有效实现了线程间的同步和通信。此外,文章还讨论了唤醒丢失问题和生成方与使用者问题,以实际示例阐述了条件变量在解决并发问题中的作用。
摘要由CSDN通过智能技术生成

条件变量属性

使用条件变量可以以原子方式阻塞线程,直到某个特定条件为真为止。条件变量始终
与互斥锁一起使用。
使用条件变量,线程可以以原子方式阻塞,直到满足某个条件为止。对条件的测试是
在互斥锁(互斥)的保护下进行的。
如果条件为假,线程通常会基于条件变量阻塞,并以原子方式释放等待条件变化的互
斥锁。如果另一个线程更改了条件,该线程可能会向相关的条件变量发出信号,从而
使一个或多个等待的线程执行以下操作:
■ 唤醒
■ 再次获取互斥锁
■ 重新评估条件
在以下情况下,条件变量可用于在进程之间同步线程:
■ 线程是在可以写入的内存中分配的
■ 内存由协作进程共享
调度策略可确定唤醒阻塞线程的方式。对于缺省值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_PRIVATEPTHREAD_PROCESS_SHAREDPTHREAD_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
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值