是否在跨线程数据访问时几乎总是需要进行线程同步(即使用互斥锁,信号量,临界区等),即使通过一个线程后不需要需求分析?最佳实践:线程之间的同步
0
A
回答
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
相关问题
- 1. cuBLAS同步最佳实践
- 2. 多线程最佳实践
- 3. 多线程最佳实践
- 4. Delphi线程最佳实践
- 5. NSUserDefaults同步的最佳实践
- 6. 同步两个表,最佳实践
- 7. Web API同步呼叫最佳实践
- 8. iOS IMAP与MailCore最佳实践同步
- 9. 数据库同步 - 最佳实践
- 10. 多步骤流程的最佳实践
- 11. 异步Webrequest最佳实践
- 12. 异步编程最佳实践
- 13. Java UDP多线程的最佳实践
- 14. java中的多线程最佳实践
- 15. Java线程会话的最佳实践
- 16. WPF客户端和服务器最佳实践之间的WCF同步
- 17. iOS线程 - 回调最佳实践
- 18. 最佳实践来使用线程
- 19. ASP.NET和多线程最佳实践
- 20. 在类之间使用相同函数的最佳实践
- 21. Java线程可见性 - 没有显式同步的最佳可见性实践
- 22. 关于同步性/异步性假设的最佳实践
- 23. SPA应用程序和服务器同步,最佳实践
- 24. Laravel异步请求的最佳实践
- 25. JPA/Hibernate实体类和同步的最佳实践是什么?
- 26. 同步两个不同系统用户的最佳实践表
- 27. Java - 网络 - 最佳实践 - 混合同步/异步命令
- 28. 在不同编程语言之间传递加密数据的最佳实践
- 29. 最佳实践
- 30. 最佳实践
如果它不要求它不是必需的。你到底在问什么? – sth 2009-06-25 20:34:34
无论是否需要,我是否应该在跨线程访问数据时锁定线程? – stanigator 2009-06-25 20:35:45