std::unique_lock 类提供了 defer_lock 参数,用于创建一个没有锁定的互斥量对象。这意味着它延迟了对互斥量的加锁操作,直到你显式调用 lock() 或者将其传递给其他支持互斥量的函数为止。
以下是一个使用 defer_lock 的示例:
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
void printHello()
{
std::unique_lock<std::mutex> lock(mtx, std::defer_lock);
// 这里可以进行一些无需加锁的操作
lock.lock(); // 现在开始加锁
std::cout << "Hello from thread: " << std::this_thread::get_id() << std::endl;
lock.unlock(); // 解锁
}
int main()
{
std::thread t1(printHello);
std::thread t2(printHello);
t1.join();
t2.join();
return 0;
}
在上述示例中,我们创建了两个线程,并使用 std::unique_lock 对互斥量 mtx 进行延迟加锁(即传递了 std::defer_lock)。这样,当我们调用 lock.lock() 时,才会实际地对互斥量进行加锁操作。
通过使用 defer_lock,我们可以在确保不需要立即加锁的情况下,避免不必要的资源竞争和等待。一旦需要加锁,可以通过调用 lock() 进行显式加锁操作。同样地,我们也可以使用 unlock() 对互斥量进行解锁操作。
注意:在使用 defer_lock 时要确保在适当的时机手动调用 lock() 来避免竞态条件或死锁情况的发生。
内容由零声教学AI助手提供,问题来源于学员提问




