c# - 多线程访问内存

标签 c# multithreading memory

早上好

假设我有 6 个不同的线程,我想同时与每个线程共享相同的数据。我可以用我想要共享的数据创建一个类变量并让每个线程同时访问该内存而不降低性能,还是将数据的真实副本传递给每个线程更可取?

非常感谢。

最佳答案

这完全取决于数据;

  • 如果数据是不可变的(或者是可变的,但你实际上并没有改变它),那么就把所有的线程都处理掉——很好
  • 如果你需要改变它,但没有两个线程会依赖另一个改变的数据 - 很好
  • 如果你需要改变它,并且存在冲突,但你可以明智地同步对数据的访问,这样就不会有两个线程死锁等风险 - 很好,但并不总是微不足道的
  • 如果做出任何假设都不安全,那么真正的数据克隆是最安全的方法,但在数据复制方面的开销最大;如果数据的复制成本很低,这可能没问题——而且确实可能​​优于同步
  • 如果线程确实相互依赖,那么您别无选择,只能找出某种明智的锁定策略;再次 - 强调:死锁是这里的一个问题 - 一些想法:
    • 总是在获取锁时提供超时
    • 如果您需要锁定两个项目,尝试锁定两个项目急切可能会有所帮助(而不是在开始时锁定一个项目,然后在完成大量更改后锁定另一个项目)- 然后您可以简单地释放并重新获取锁,而不必撤消更改或将更改放回特定状态

关于c# - 多线程访问内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4690090/

相关文章:

c# - 在 C# 中的两个日期之间迭代

python - 如何在线程池执行的函数中仅发送一次电子邮件?

c - 如何使用它来杀死线程数组?

c# - 新窗口打开后的位置

c# - 适用于 Windows x64 上大文件的良好 ISAM 库或其他简单文件管理器

java - 在ArrayBlockingQueue中,为什么将final成员字段复制到本地final变量中?

c++ - 用于检测 C/C++ 中指针别名问题的工具

c++ - 不同模块 (DLL) 的类大小不同。如何以及为什么?

ios - Xcode 中的内存警告 - didReceiveMemoryWarning 中的作用是什么?

c# - 使用 Jabber-Net 连接到 Openfire 服务器时绑定(bind)资源时出错