代码之家  ›  专栏  ›  技术社区  ›  jcoder

同时访问大量项集合

  •  3
  • jcoder  · 技术社区  · 14 年前

    我正在使用Windows和Linux上的C++进行一个仿真项目。

    模拟中将有几千个对象(可能3000-5000个)。计划让多个线程对对象执行操作,以便充分利用多核机器,例如一个线程处理对象的移动和位置,一个(或多个)处理对象之间的交互,一个处理新对象的创建。

    但是,这需要在线程之间进行同步,以确保其正常工作。所以我认为每个对象应该包含一个(pthread mutex/critical_部分),这取决于平台,然后每个线程可以锁定它当前正在处理的对象。因为有很多对象争用应该很少,所以应该很快。

    所以我的第一个问题是3000-5000个pthread mutex或windows关键部分是否太多?我不知道两个系统都有什么限制。还是有更好的方法来实现这一点?

    我的第二个问题是关于保存对象的数据结构。因为对象可以被创建并“消亡”,我觉得最好的方法是存储一个活动对象的“列表”,工作线程可以迭代这些活动对象。C++列表不是线程安全的。如果我的一个线程删除了一个对象,我需要将它与列表中执行“next()”的另一个对象同步。另外,在将迭代器移动到它之前,我需要确保“next”对象被锁定,这样我就需要对整个集合进行某种全局锁定,在插入/删除对象之前,以及在移动到线程上的下一个对象之前,都必须获得这种全局锁定。

    这似乎相当痛苦,而且可能很慢。有更好的方法吗?

    4 回复  |  直到 14 年前
        1
  •  1
  •   Falmarri    14 年前

    与其让线程对对象执行不同的操作,为什么不让每个线程对不同的对象执行不同的操作呢?听起来你在做粒子碰撞。我做了一个类似的项目,虽然我的没有线程。但是,如果您可以将对象分组为“空间”,则每个线程都可以在自己的空间上工作,并将对象从一个空间传递到另一个空间。如果有1个线程执行位置跟踪,1个线程执行冲突计算,则会导致性能下降,因为这些计算是紧密耦合的。只有当一个线程不直接依赖于其他线程时,线程才是好的。

        2
  •  3
  •   StuartLC    14 年前

    特别是在Windows平台上,您可以查看 Slim Reader/Writer (SRW) Locks -这将允许多个并发读卡器。

        3
  •  3
  •   Merlyn Morgan-Graham    14 年前

    看看无锁集合。我相信英特尔的 Threading Building Blocks (开源)有一些。

        4
  •  0
  •   caf    14 年前

    pthread_mutex_t 您可以在Linux上创建-它们不必在任何地方集中注册。未锁定的互斥体不占用除用于存储 pthRead .

    如果要锁定每个单独的对象,请注意锁顺序死锁。您需要对对象定义一个严格的顺序,并确保它们始终按该顺序锁定。