1

我知道如果两个线程正在写入同一个地方,我需要确保它们以安全的方式执行并且不会导致任何问题,但是如果只有一个线程读取并完成所有写入,而另一个线程只是读取,该怎么办。

在我的情况下,我第一次在一个小游戏中使用一个线程来保持更新与渲染分开。完成所有渲染的类永远不会写入它读取的任何内容,因此我不确定是否需要处理它们共享的所有内容的每次读取和写入。

我将采取正确的步骤来确保渲染器不会尝试读取不再存在的任何内容,但是在调用播放器和实体的吸气剂之类的东西时,我应该以同样的方式对待它们吗?或者将 x、y 线和布尔值(如“alive”)设置为 volatile 是否有效?

我对此的理解变得非常模糊,可以做一些启发性的

编辑:共享数据将是需要绘制、移动和存储在对象列表中的任何内容。例如玩家和其他实体的;

4

2 回答 2

2

使用给定的信息,不可能准确地指定解决方案,但很明显,您需要某种方法来在线程之间进行同步。问题是,只要写入操作不是原子的,您就可以在数据更新时读取数据。这意味着您例如获得一个旧的 y 坐标和一个新的 x 坐标。

基本上,如果两个线程都只读取信息,或者 - 甚至更好 - 如果所有数据结构都是不可变的(因此两个线程都不能修改对象),则基本上您不需要担心同步。最好的方法是首先考虑哪些操作需要是原子的,然后创建一个解决方案来使操作成为原子的。

不要忘记:让它工作,让它正确,让它优化(按这个顺序)。

于 2013-07-06T12:51:36.450 回答
0

如果列表的大小是可变的并且您不同步对它们的访问,则在这种情况下您可能会遇到问题,请考虑以下问题:

  • 只读线程读取 mySharedList 大小,发现它是 15;在那一刻,它的 CPU 时间结束,读写线程被分配给 CPU
  • 读写线程从列表中删除一个元素,现在它的大小是 14。
  • 只读线程再次被授予 CPU 时间,它尝试使用它在被中断之前读取的(现在已过时的)大小读取最后一个元素,您将遇到异常。
于 2013-07-06T12:53:47.377 回答