2009-06-25 41 views
0

是否在跨线程数据访问时几乎总是需要进行线程同步(即使用互斥锁,信号量,临界区等),即使通过一个线程后不需要需求分析?最佳实践:线程之间的同步

+5

如果它不要求它不是必需的。你到底在问什么? – sth 2009-06-25 20:34:34

+0

无论是否需要,我是否应该在跨线程访问数据时锁定线程? – stanigator 2009-06-25 20:35:45

回答

5

我总是会建议使用最简单,最直接的同步方案走,直到分析显示,你应该做的,否则 - 这通常意味着几大门锁与许多细粒度锁或lockfree。

问题是,确定无锁代码是否正确比确定带锁的相应代码是否正确困难得多。这给代码的维护者造成了很大的负担,并且很有可能他们会错误地引入错误。即使你知道无锁是否对你的代码当前被使用是安全的,这可能会在未来被那些不知道的人改变。其次,在许多情况下,代码与锁和无锁代码之间的性能差异是可以忽略的 - 直到您知道锁争用存在问题时,您不应该考虑无锁。即使存在争用问题,无锁也不一定是最佳解决方案。

2

即使你并不需要一个互斥体,信号量,临界区等,为他们正常的锁定语义,你可能还需要一个memory barrier。前者的结构通常意味着记忆障碍,这就是为什么删除它们可以改变程序的原因。此外,这些问题可能非常难以调试,因为涉及的线程的不同调度可能会使问题消失并出现。在最简单的情况下,这意味着仅仅运行一个完全独立的程序会改变你的行为。

0

有道理的另一种模式称为无共享。 erlang和scala可能是这个模型的主要代表,具有erlang过程和scala actors。

这个想法是,您将消息发送到其他线程,其中消息是发件人未保存任何引用的数据。在实践中,发送/接收队列需要少量的锁定,但是其余的代码可以在没有任何问题的情况下锁定。

这样的模型可以用C++和其他语言实现。

http://www.scala-lang.org/node/242 http://lambda-the-ultimate.org/node/1742 http://docs.python.org/library/multiprocessing.html#module-multiprocessing