当有跨线程数据访问时,是否几乎总是需要线程同步(即使用互斥,信号量,关键部分等),即使在进行需求分析后不需要它?
答案 0 :(得分:5)
我总是建议使用最简单,最直接的同步方案,直到分析显示你应该这样做 - 这通常意味着几个大锁与许多细粒度锁或无锁。
问题是确定无锁代码是否正确比确定带锁的相应代码是否正确要困难得多。这会给代码的维护者带来很大的负担,并且很有可能他们会错误地引入错误。即使您知道锁定对于当前使用代码的方式是安全的,但未来可能会因为不了解的人而改变。
其次,在许多情况下,带锁和无锁代码的代码之间的性能差异是微不足道的 - 除非您知道锁争用存在问题,否则您不应该考虑无锁。即使存在争用问题,无锁也不一定是最佳解决方案。
答案 1 :(得分:2)
即使您不需要互斥锁,信号量,临界区等等,也可能需要memory barrier。前面的结构通常意味着一个内存屏障,这就是为什么删除它们可以改变程序。此外,这些问题可能非常难以调试,因为所涉及的线程的不同调度可能使问题消失并出现。在最简单的情况下,这意味着仅运行完全独立的程序会改变您的行为。
答案 2 :(得分:0)
其他有意义的模型称为无共享。 erlang和scala可能是使用erlang进程和scala actor的这个模型的主要代表。
这个想法是你将消息发送到其他线程,其中消息是发送者不保留引用的数据。实际上,发送/接收队列需要少量锁定,但其余代码可以无任何问题锁定。
此类模型可以用C ++和其他语言实现。
http://www.scala-lang.org/node/242 http://lambda-the-ultimate.org/node/1742 http://docs.python.org/library/multiprocessing.html#module-multiprocessing