1

首先,我是一名 Objective-C 新手。我的大部分背景都是 Java。另外,由于大多数 Objective-C 问题都围绕 Cocoa,我应该指出这是在GNUStep上。

对于一个学校项目,我正在创建一个简单的基于代理的建模框架。这些框架通常用于模拟复杂系统(如疾病的传播)。我的框架有两个主要对象:一个世界和一个错误。世界由“层”组成,每个层都与一个环形网格相关联。世界可以由虫子组成,每个虫子都有一个 x 和 y 坐标,以及它所属的层。

我的总体想法是用错误填充世界,然后为每个错误触发线程并让他们做他们想做的事。您可以通过子类化主Bug类并实现act协议中定义的方法来创建任何类型的错误。这样您就可以拥有各种类型的自定义错误和自定义行为。Bug 应该能够与世界以及彼此交互(从世界中删除错误,向世界添加错误,移动自身)。正如你所看到的,这很快就会走向多线程地狱。

目前我有很多@synchronized障碍,我很难确保世界始终保持一致的状态。这变得特别困难,因为错误需要与世界通信并对其采取行动,反之亦然。我正在尝试实现一个名为 a 的简单错误RandomBug,它会在世界各地随机移动。即使这也被证明是困难的,因为我看到了状态可能被破坏或无效的潜在问题。

我开始看一看,NSOperation因为NSOperationQueue看起来这可能会让事情变得更容易。我有两个与此有关的问题:

  • 是否有一种简单的方法可以NSOperation重复执行 s(即,以特定的时间间隔)。
  • 如果我将线程上的最大并发操作数设置为 1,我还需要@synchronized块吗?在给定时间不会只有一个线程与世界交互吗?
  • 有没有更好的方法来解决这类问题(多个线程以重复的方式与一个共享资源交互)?
  • 我应该完全放弃线程并简单地遍历世界上的错误并以随机方式激活它们吗?
4

1 回答 1

2

听起来你可能想要一些游戏/模拟循环......所以你有一个“更新世界”阶段的你的运行循环对于你的模拟的每个时间步骤(由一个触发NSTimer),每个错误都有机会与之交互世界; 重复。除非您的错误是 CPU 密集型的,否则这可能是要走的路......

至于使用 NSOperation——当然,这可能会让你使用所有的 CPU 内核,但是如果有很多争用访问世界状态的问题,这毕竟可能不是一场胜利。在这种情况下,您可以尝试将您的世界中的每个图块作为您可以@synchronized对抗的单独对象,从而减少争用并允许更好地使用您的 CPU。

基本上,使用单个NSOperationQueue和设置maxConcurrentOperations = 1与实现游戏循环相同。如果您使用NSOperationQueue,但不设置maxConcurrentOperations,我希望NSOperationQueue同时运行与 CPU 内核一样多的操作。

于 2012-08-21T04:01:58.420 回答