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 方法与直接锁定互斥锁是否有任何积极或消极的性能差异,或者只是浪费指令?
lock()如果锁不可用将阻塞,而try_lock()即使锁不可用也会立即返回。
第一种形式轮询锁直到它可用,这有两个缺点:
根据循环中的延迟,可能会有不必要的延迟。该锁可能会在 try_lock 尝试后立即变为可用,但您的进程仍在等待预设延迟。
轮询锁是浪费CPU周期
一般来说,您应该只try_lock在线程在等待锁时可以做一些有用的事情时使用,在这种情况下,您不希望线程阻塞等待锁。
另一个用例try_lock是尝试锁定超时,以便如果锁定在特定时间内未变为可用,则程序可能会中止。
lock() 通常不直接调用:std::unique_lock 和 std::lock_guard 用于管理排他锁定。
根据情况使用这些类可能更合适。