线程最佳实践

11 浏览
0 Comments

线程最佳实践

我参与的很多项目都有糟糕的线程实现,而我就是那个要追踪问题的人。有没有一种公认的最佳处理线程的方法?我的代码总是在等待永远不会触发的事件。

我有点像在想设计模式之类的东西。

admin 更改状态以发布 2023年5月23日
0
0 Comments

学习正确编写多线程程序是非常困难和耗时的。

所以第一步是:用不使用多线程的实现来替换原始实现。

然后,只有当您发现确实需要它(在找到一些安全简单的方法时)时,小心地将线程重新引入。可靠的非线程实现比损坏的线程实现要好得多。

当您准备好开始时,请优先选择使用线程安全的队列来在线程间传递工作项,并确保这些工作项仅由一个线程访问。

请尽量避免在代码中仅仅添加锁块以使其线程安全。这是行不通的。最终,两个代码路径会以不同的顺序获取相同的锁,一切都会停滞不前(每两周在客户的服务器上出现一次)。如果您将线程与触发事件结合使用,并且在触发事件时保持锁定,那么可能会出现问题 - 处理程序可能会取出另一个锁,现在您有一对按特定顺序持有的锁。如果在其他情况下以相反的顺序取出它们会怎么样?

简而言之,这是一个大而困难的主题,我认为在短篇答案中给出一些指针并说“开始吧!”可能是误导人的 - 我相信这里许多有学问的人给出答案的目的都不是这样,但这是许多人从摘要建议中得出的印象。

相反,购买这本书

这里有一个非常好的总结来自这个网站

多线程也有缺点。最大的问题是它可能导致程序变得复杂得多。拥有多个线程本身并不会产生复杂性;线程之间的相互作用会产生复杂性。无论交互是否有意,在多线程设计中都适用,可能导致长时间的开发周期,以及持续易受影响的和无法再现的错误。因此,除非您特别喜欢重写和调试!否则在多线程设计中使这种交互变得简单或者不使用多线程。

Stroustrup的完美总结

通过让一堆线程在单个地址空间中自由运行,然后使用锁定来尝试处理由此产生的数据竞争和协调问题的传统方式可能是在正确性和可理解性方面最糟糕的。

0
0 Comments

(假设是.NET平台;其他平台也有类似的事情。)\n\n嗯,有很多事情需要考虑。我建议:\n\n- 不可变性对于多线程非常有用。函数式编程部分原因是强调不可变性,并且可以很好地同时运行。\n- 当您访问可变共享数据时,请使用锁,不论是读还是写。\n- 除非您真的必须这样做,否则不要尝试去锁定。锁定是昂贵的,但很少是瓶颈。\n- Monitor.Wait几乎总是应该是条件循环的一部分,等待条件变为真,并在条件不满足时再等待。\n- 尽量避免长时间持有锁定。\n- 如果您需要同时获取两个锁,请仔细记录排序并确保始终使用相同的顺序。\n- 记录您的类型的线程安全性。大多数类型不需要线程安全,它们只需要不对线程敌意(即“您可以从多个线程中使用它们,但如果要共享它们,则是您的责任取出锁定”)。\n- 从非UI线程访问UI(除了记录线程安全的方式)是不可接受的。在Windows Forms中,请使用Control.Invoke / BeginInvoke\n\n这是我脑海中的想法,如果对您有用,我可能会想到更多,但在这里我会停止。

0