锁定与(try_lock,睡眠,重复)性能

use*_*015 4 c++ multithreading mutex locking thread-safety

我正在更新一些代码,我遇到了几个正在使用这些行的互斥锁:

while (!mutex_.try_lock())
    sleep_for(milliseconds(1));
Run Code Online (Sandbox Code Playgroud)

而不是直接锁定互斥锁:

mutex_.lock();
Run Code Online (Sandbox Code Playgroud)

使用 try lock 和 sleep 方法与直接锁定互斥锁是否有任何积极或消极的性能差异,或者只是浪费指令?

har*_*mic 6

lock()如果锁不可用将阻塞,而try_lock()即使锁不可用也会立即返回。

第一种形式轮询锁直到它可用,这有两个缺点:

  1. 根据循环中的延迟,可能会有不必要的延迟。该锁可能会在 try_lock 尝试后立即变为可用,但您的进程仍在等待预设延迟。

  2. 轮询锁是浪费CPU周期

一般来说,您应该只try_lock在线程在等待锁时可以做一些有用的事情时使用,在这种情况下,您不希望线程阻塞等待锁。

另一个用例try_lock是尝试锁定超时,以便如果锁定在特定时间内未变为可用,则程序可能会中止。

cppreference说:

lock() 通常不直接调用:std::unique_lock 和 std::lock_guard 用于管理排他锁定。

根据情况使用这些类可能更合适。