C++ std::counting_semaphore, std::binary_semaphore2025 年 2 月 11 日 | 阅读 8 分钟 概述在 C++20 中,初始库进行了多项改进,在整个编程过程中实现了并发同步,特别是 std::counting_semaphore 和 std::binary_semaphore。 上述每种主要的同步方法都旨在帮助线程集成,同时在整体并发方案中提供一定的优势。 ![]() std::counting_semaphore 作为一种信号量,它维护着可用资源和许可证总数的匿名记录。知情同意数据库以足够可接受的计数开始,线程可以通过调用 acquire() 来获取特权,从而减少计数,并通过调用 release() 来释放特权,从而增加可能性。如果计数为零,线程将阻塞,直到有特权可用。 另一方面,std::binary_semaphore 是一种专有的信号量类型,仅支持零或一计数,因此充当使用二进制数据的信号量。它适用于需要线程之间进行信号通信的简单场景,包括组织任务的启动或直接实现互斥。这种特定的同步类型通常用作更复杂的同步模式的起点,例如,建立锁或在生产者-消费者系统中的线程之间进行信号通信。 语法它具有以下语法: 说明
std::counting_semaphore 和 std::binary_semaphore 都通过提供更具表现力和灵活性的线程协调管理工具来增强现代 C++ 处理并发的能力。它们融入了 C++20 现代化标准库并为多线程编程提供强大支持的更广泛背景中。 性质自 C++20 以来,协调原语 std::counting_semaphore 和 std::binary_semaphore 具有许多不同的特性,使其适用于各种并发需求。 1. std::counting_semaphorestd::counting_semaphore 的独特性在于它能够处理可用资源和许可证的数量,因此在许多不同的同步场景中都非常有用。它最初以一个正整数开头,表示可用许可证的数量。线程可以使用两种基本操作:acquire() 和 release() 与信号量进行通信。信号量寄存器已设置为非负整数计数,表示可用许可证的数量。
2. std::binary_semaphore
总而言之,std::counting_semaphore 提供了管理多个许可证和控制对资源的访问的灵活机制,而 std::binary_semaphore 提供了更简单的二进制信号通信机制。两者都是现代 C++ 编程中有效线程管理和同步的重要组成部分。 示例在 C++20 中,引入了两个新的同步原语:std::counting_semaphore 和 std::binary_semaphore。这些信号量是 <semaphore> 头文件的一部分,并提供了在并发编程中控制对资源的访问的方法。 以下是每种信号量的简要概述
以下是一个演示如何使用 std::counting_semaphore 和 std::binary_semaphore 的简单示例 std::counting_semaphore 示例让我们举一个例子来说明 C++ 中的 std::counting_semaphore() 函数。 输出 Thread Thread 14 is waiting for a permit. Thread 4 has acquired a permit. Thread 3 is waiting for a permit. Thread 3 has acquired a permit. Thread 2 is waiting for a permit. Thread 2 has acquired a permit. is waiting for a permit. Thread 4 is releasing the permit. Thread 2 is releasing the permit. Thread 1 has acquired a permit. Thread 3 is releasing the permit. Thread 1 is releasing the permit. std::binary_semaphore 示例让我们举一个例子来说明 C++ 中的 std::binary_semaphore() 函数。 输出 Thread 1 is waiting for the semaphore. Thread 1 has acquired the semaphore. Thread 2 is waiting for the semaphore. Thread 1 is releasing the semaphore. Thread 2 has acquired the semaphore. Thread 2 is releasing the semaphore. 说明在 std::counting_semaphore 示例中,程序演示了多个线程如何与管理固定数量许可证的信号量进行交互。信号量初始化时最多有 3 个许可证,这意味着最多可以有三个线程同时获取一个许可证。 程序创建了四个线程,每个线程都尝试从信号量获取一个许可证。线程 1、2 和 3 由于有三个可用许可证,因此能够立即获取许可证。一旦线程获取了许可证,它将继续模拟一些工作,以睡眠时间表示。完成工作后,线程将许可证释放回信号量,使其可供其他线程使用。 然而,线程 4 必须等待其中一个许可证被释放,因为线程 1、2 和 3 最初占用了所有许可证。一旦其中一个线程释放了许可证,线程 4 就可以获取它并执行其工作。输出显示线程 4 仅在其中一个其他线程完成并释放许可证后才开始其工作。此行为说明了 std::counting_semaphore 如何有效地管理对有限数量资源的访问。 复杂度C++ 中 std::counting_semaphore 和 std::binary_semaphore 的复杂过程通常与其获取和释放二进制信号量所需的时间成正比,这使得它们成为其性能的关键组成部分。让我们更深入地研究一下。 1. Std::counting_semaphore 在获取过程时,您可以使用 acquire()和 acquire_for() 方法。 时间复杂度: 通常,平均而言,std::counting_semaphore() 函数的时间复杂度为 O(1)。上述命令会终止线程,阻止其继续,如果信号量的数量为零,并在计数为正时恢复。在大多数情况下,有效执行的信号量所涉及的复杂性是连续的时间。尽管如此,在边缘情况或当情况涉及大量反对时,它可能需要更复杂的管理。 使用 Release 操作 (release())。 时间复杂度: O(1)。 部署模拟信号量需要增加字符数,并可能唤醒任何等待的线程。 2. Std::binary_semaphore 在获取操作时,您可以使用 acquire() 和 acquire_for() 方法。通常,时间复杂度为 O(1)。二进制信号量仅包含两个可能的结果(0 或 1);因此,获取它是一个简单的弯曲检查,如果被检查的不是可用的,最终可能会阻塞。由于它只是在验证和可能暂停线程,因此时间和复杂性保持恒定。 Release 操作 (release()) 的时间复杂度为 O(1)。要释放二进制信号量,请将当前状态设置为 1(如果之前为 0),并在必要时唤醒等待的线程。由于 std::counting_semaphore 的原因,该过程本身大约需要恒定的时间。 结论
总之,std::counting_semaphore 和 std::binary_semaphore 为现代 C++ 程序中的并发和同步管理提供了强大而高效的工具。它们的恒定时间操作和简单的语义使其在广泛的并发编程场景中具有价值。 下一个主题C++ 代码计算给定数组的局部极值 |
C++ 和 COBOL 都是高级编程语言。C++ 用于系统级编程和开发高度复杂的应用程序。另一方面,COBOL 在公司和政府的业务和财务管理中仍然更广泛地使用。当...
5 分钟阅读
概述是指将汇编语言语句合并到 C++ 代码中的能力。此功能对于需要显著性能增强或 C++ 命令无法直接提供的特定硬件操作非常有用。汇编代码用于提供更大的...
阅读 10 分钟
?列表是 C++ 中的一种容器,它将数据存储在不连续的内存位置。此外,它还有一个常量迭代器,它为其元素提供常量引用。当使用 const_iterator 遍历 C++ 中的列表时,我们必须遍历...
阅读 4 分钟
在数字和数学原理的交叉点上,计算几何的广阔领域中有许多引人入胜的问题有待探索和解决,这是令人难以置信的。最基本的问题是确定从两个...开始的坐标系中点之间的最大坐标。
阅读 16 分钟
在本文中,我们将讨论 Golomb 序列的应用和示例。什么是 Golomb 序列?Golomb 序列是一个非递减整数序列,其中序列中第 n 个位置的整数是整数 n 在该序列中出现的次数……
5 分钟阅读
简介:龙形曲线是最有趣的分形之一。几十年来,数学家和计算机科学家一直被每次迭代增加时出现的精美而复杂的结构图案所吸引。与大多数需要复杂数学公式的分形不同,...
阅读 4 分钟
本文将介绍 C++ std::inner_product 的语法规则和示例。概述 Std::inner_product 是 C++ 编程语言中一个不可或缺的函数,它提供了一种有效的方法来确定两个过程的内积。上述方法在...时非常有益。
阅读 6 分钟
揭示编程的力量 在数据结构的广阔领域中,笛卡尔树(Cartesian Trees)提供了一种优雅而高效的解决方案,尤其是在处理动态序列时。笛卡尔树最初由 Vuillemin 于 1980 年提出,已广泛应用于算法设计等各个领域……
11 分钟阅读
珠宝和石头问题是一个常见的编码练习,有时会在面试中出现。它要求我们估计石头中珠宝的比例。目标是找到 S 中也存在于 J 中的字符数,给定两个...
阅读 4 分钟
在本文中,我们将讨论 C++ 中的 Concepts 和 Type Traits 之间的区别。在讨论它们的区别之前,我们必须了解 Concepts 和 Type Traits 的语法和示例。Concepts:C++20 Concepts 是功能强大的工具,具有广泛的适用性,主要用于简化...
阅读 13 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India