在多线程代码中出于性能原因要避免什么?

Jor*_*oba 7 performance multithreading

我目前正在审查/重构一个多线程应用程序,该应用程序应该是多线程的,以便能够使用所有可用内核并理论上提供更好/更优越的性能(优越的商业术语更好:P)

在编写多线程应用程序时我应该注意哪些事项?

我的意思是会对性能产生很大影响的事情,甚至可能会让您在多线程中没有获得任何东西,但却因设计复杂性而损失惨重.多线程应用程序有哪些重要的危险信号?

我应该开始质疑锁定并寻找无锁策略,还是应该点亮警示灯还有其他更重要的点?

编辑:我想要的答案类似于Janusz的答案,我希望在代码中查找红色警告,我知道应用程序执行效果不佳,我需要知道从哪里开始查找什么应该担心我,我应该在哪里努力.我知道这是一个普遍的问题,但我无法发布整个程序,如果我可以选择一段代码,那么我首先不需要问.

我正在使用Delphi 7,虽然应用程序将在明年移植/重新制作.NET(c#),所以我宁愿听到适用于一般做法的评论,如果它们必须特定于任何一个那些语言

Zan*_*ynx 6

绝对避免的一件事是对线程的相同缓存行进行大量写访问.

例如:如果使用计数器变量来计算所有线程处理的项目数,这将严重影响性能,因为只要其他CPU写入变量,CPU缓存行就必须同步.


Jan*_*usz 5

降低性能的一件事是拥有两个具有大量硬盘访问权限的线程.硬盘驱动器会从为一个线程提供数据跳转到另一个线程,并且两个线程都会一直等待磁盘.


Rob*_*Rob 5

锁定时要记住的事项:锁定尽可能短的时间.例如,而不是这样:

lock(syncObject)
{
    bool value = askSomeSharedResourceForSomeValue();
    if (value)
        DoSomethingIfTrue();
    else
        DoSomtehingIfFalse();
}
Run Code Online (Sandbox Code Playgroud)

这样做(如果可能的话):

bool value = false;  

lock(syncObject)
{
    value = askSomeSharedResourceForSomeValue();
}  

if (value)
   DoSomethingIfTrue();
else
   DoSomtehingIfFalse();
Run Code Online (Sandbox Code Playgroud)

当然,这个例子只是工作,如果DoSomethingIfTrue()DoSomethingIfFalse()不要求同步,但它说明了这一点:锁定为尽可能短的时间越好,而也许不是一直在提高你的表现,会提高你的代码的安全性,因为它降低了表面同步问题的区域.

在某些情况下,它会提高性能.长时间保持锁定意味着等待访问某些资源的其他线程将等待更长时间.