锁定vs(try_lock,sleep,repeat)性能

时间:2015-10-09 20:46:31

标签: c++ multithreading thread-safety locking mutex

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

var document = XDocument.Load (fileName);
var reader = new PackagesConfigReader (document);
foreach (PackageReference package in reader.GetPackages ())
{
    Console.WriteLine (package.PackageIdentity);
}

而不是直接锁定互斥锁:

while (!mutex_.try_lock())
    sleep_for(milliseconds(1));

使用try lock和sleep方法与直接锁定互斥锁是否有正面或负面的性能差异,还是只是浪费了指令?

1 个答案:

答案 0 :(得分:4)

如果锁定不可用,

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

第一个表单会轮询锁定,直到它可用,这有两个缺点:

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

  2. 浪费CPU周期轮询锁

  3. 一般情况下,如果线程在等待锁定时可以执行某些有用的操作,则只应使用try_lock,在这种情况下,您不希望线程阻塞等待锁定。

    try_lock的另一个用例是尝试使用超时锁定,这样如果锁定在一定时间内没有可用,则程序可能会中止。

    cppreference说:

      

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

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