C++ pthread_cond_broadcast() 方法

2025 年 2 月 11 日 | 阅读 4 分钟

在本文中,我们将讨论 C++ 中的 pthread_cond_broadcast() 方法。此方法属于 POSIX 库。此函数专门用于线程内 UI 开发。pthread_cond_broadcast() 函数有一个真正的概念,应该使用多线程、条件和 pthread 库的原理来理解。

什么是线程?

进程的基本单位是线程,它是进程中正在完成的最小工作量。驻留在同一进程中的字符串也使用相同的资源,例如内存空间、文件描述符、进程特定属性和其他进程特定元素。线程化支持多任务处理,从而产生并行执行。因此,程序整体效率得以提高。

条件变量

条件变量是多线程程序使用的同步机制,用于使线程能够交换重要信息并及时执行进程。这些变量与互斥变量一起使用。

Pthreads 库

Pthreads (POSIX) 或类 Unix 操作系统(包括 Linux 和 macOS)的线程可移植性可以通过 API (应用程序编程接口) 实现,该 API 已针对 Unix 系统标准化。它包含用于创建、执行操作和同步线程的接口和方法集。

互斥锁

互斥锁或互斥用于保护需要一次由单个线程访问共享资源的代码的关键部分。在线程访问互斥锁锁定的关键部分之前,线程必须首先锁定互斥锁。

pthread_cond_broadcast()

pthread_cond_broadcast() 函数有助于向多个处于等待阶段的线程发送信号。条件更改会触发 pthread_cond_broadcast,它会一次性解锁所有这些线程,而不是仅仅解锁那些线程。此活动将绕过持有条件变量的等待线程。

pthread_cond_broadcast() 函数将解锁所有被信号量 cond 阻塞的线程。如果任何线程当前正在等待指定的条件变量 cond,则 pthread_cond_signal() 函数将至少解锁其中一个等待线程。当多个线程被阻塞在条件变量中时。解锁将由调度策略决定。在返回 pthread_cond_wait()pthread_cond_timedwait() 后,pthread_cond_broadcast() 或 pthread_cond_signal() 的结果使每个线程的状态更改为运行状态。可运行的线程将拥有互斥锁,这称为 pthread_cond_broadcast() 或 pthread_cond_signal()。互斥锁可以释放,当它发生时,其他等待轮到的线程可以尝试锁定互斥锁。

系统中的任何线程都可以任意次数调用 pthread_cond_broadcast()pthread_cond_signal() 函数,即使该线程没有获取互斥锁。

语法

它具有以下语法:

返回值

如果 pthread_cond_broadcast() 和 pthread_cond_signal() 函数成功,它们将返回 0;否则,将返回错误号,表示存在错误。

应用使用

  • pthread_cond_broadcast() 函数是共享变量状态可用于更新的方法之一。通过 pthread_cond_broadcast() 调用过程,生产者将通知所有可能的等待消费者,从而提高多处理器工作负载分配。此外,使用 pthread_cond_broadcast(),读写锁的实现变得更容易。
  • 当写入器释放锁时,pthread_cond_broadcast() 函数用于唤醒所有等待的读取器。最后,两阶段提交操作可以依赖广播函数来通知所有客户端即将进行的事务提交。
  • pthread_cond_signal() 函数在由异步信号进程调用的信号处理程序中不安全使用。因为它性质复杂。因此,条件变量不适合服务器信号传递。

示例

输出

 
Thread 2 proceeding.
Thread 1 proceeding.   

说明

以下是 C++ 代码,它展示了如何使用 POSIX 线程 (pthreads) 通过使用条件变量来同步多个线程的执行。代码首先声明一个互斥锁和一个条件变量,以及共享布尔变量 val。每个线程执行的 threadFun 函数锁定互斥锁并检查 val 的值。
如果 val 为 false,线程将进入条件变量的等待状态,并在此过程中释放互斥锁。主函数启动两个线程,它们都执行 threadFun;两个操作之间有一秒的延迟。在此之后,互斥锁被锁定,val 变为 true,并使用 pthread_cond_broadcast 唤醒所有等待的线程。最后,一个线程等待另一个线程完成执行,然后终止程序的执行。该程序仍然有助于清晰地展示如何使用互斥锁和条件变量进行线程同步和通信。