C++ 中的 std::defer_lock_t、std::try_to_lock_t 和 std::adopt_lock_t

2025 年 5 月 17 日 | 4 分钟阅读

在本文中,我们将讨论 C++ 中的 std::defer_lock_t、std::try_to_lock_t 和 std::adopt_lock_t 及其语法和示例。 C++ 中提供了这三种标签类型:std::defer_lock_t、std::try_to_lock_t 和 std::adopt_lock_t。这些标签类型主要与 std::unique_lock 和 std::lock_guard 结合使用,以定义与互斥量一起工作时的锁定行为。

什么是 Std::defer_lock_t?

使用此标签类型,可以在创建对象(例如 std::unique_lock 或 std::lock_guard)时延迟锁定。当使用 std::defer_lock 构造锁对象时,与锁关联的互斥量不会立即锁定。之后,我们可以使用 lock() 成员函数显式锁定互斥量。

语法

它具有以下语法:

什么是 Std::try_to_lock_t?

此标签类型的目的是尝试获取锁而不阻塞。如果锁不可用,则锁构造函数不会阻塞,锁对象将以未锁定状态创建。它使我们能够通过非阻塞方法尝试获取锁。

语法

它具有以下语法:

什么是 Std::adopt_lock_t?

此标签类型用于指示调用线程已经拥有与互斥量关联的锁。当我们将锁从一个作用域移动到另一个作用域时,我们通常为此目的使用它。

语法

它具有以下语法:

示例 1

让我们举一个例子来说明 C++ 中的 std::defer_lock_t、std::try_to_lock_t 和 std::adopt_lock_t。

输出

Deferred Locking: Thread ID: 135034438377280
terminate called after throwing an instance of 'std::system_error'
  what():  Resource deadlock avoided
Aborted

说明

在此示例中,此代码说明了如何在各种上下文中应用每种标签类型。在初始情况下,锁定会延迟到 std::defer_lock 明确请求为止。在第三种情况下,std::adopt_lock 假设调用线程已经拥有锁,而在另一种情况下,std::try_to_lock 会尝试获取锁而不阻塞。

示例 2

让我们再举一个例子来说明 C++ 中的 std::defer_lock_t、std::try_to_lock_t 和 std::adopt_lock_t。

输出

Deferred Locking: Thread ID: 138276743659328
Try To Locking: Thread ID: 138276743659328
Adopt Locking: Thread ID: 138276743659328

结论

总之,std::defer_lock_t、std::try_to_lock_t 和 std::adopt_lock_t 标签类型在并发编程中处理互斥量方面提供了重要的灵活性。std::defer_lock_t 允许互斥量在未明确请求的情况下被锁定,从而可以控制锁定序列。通过使用 std::try_to_lock_t,该程序可以通过启用非阻塞锁获取来处理无法立即获取锁的情况,std::try_to_lock_t 会尝试在不阻塞的情况下获取锁。最后,std::adopt_lock_t 意味着调用线程已经拥有与互斥量关联的锁。它在多个程序组件共享互斥量或需要转移锁所有权的情况下很有用。这些标签类型主要与 std::unique_lock 和 std::lock_guard 一起使用,可以编写更具表达力、效率和可靠性的并发 C++ 代码。