我正在更新一些代码,我遇到了几个使用这些行的互斥锁:
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方法与直接锁定互斥锁是否有正面或负面的性能差异,还是只是浪费了指令?
答案 0 :(得分:4)
lock()
将会阻止,而即使锁定不可用,try_lock()
也会立即返回。
第一个表单会轮询锁定,直到它可用,这有两个缺点:
根据循环中的延迟,可能会有不必要的延迟。在try_lock尝试之后,锁可能会变为可用,但您的进程仍在等待预设延迟。
浪费CPU周期轮询锁
一般情况下,如果线程在等待锁定时可以执行某些有用的操作,则只应使用try_lock
,在这种情况下,您不希望线程阻塞等待锁定。
try_lock
的另一个用例是尝试使用超时锁定,这样如果锁定在一定时间内没有可用,则程序可能会中止。
通常不直接调用lock():std :: unique_lock和std :: lock_guard用于管理独占锁定。
根据具体情况,使用这些类可能更合适。