对大型项目集合的并发访问 我在Windows和Linux上使用C++进行仿真项目。

对大型项目集合的并发访问 我在Windows和Linux上使用C++进行仿真项目。,c++,windows,linux,concurrency,pthreads,C++,Windows,Linux,Concurrency,Pthreads,模拟中将有数千个对象(可能3000-5000个)。在计划中,让多个线程对对象执行操作,以便充分利用多核机器,例如一个线程处理对象的移动和位置,一个(或多个)处理对象之间的交互,一个处理新对象的创建 但是,这需要线程之间进行同步,以确保其正常工作。因此,我认为每个对象都应该包含一个(pthread mutex/CRITICAL_部分),具体取决于平台,然后每个线程都可以锁定它当前处理的对象。因为有很多对象,所以争用应该很少,所以应该很快 所以我的第一个问题是3000-5000 pthread互斥体

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

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

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

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


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

特别是在您的Windows平台上,您可以查看-这将允许多个并发读卡器。

查看无锁集合。我相信英特尔(开源)也有一些

您可以在Linux上创建的
pthread\u mutex\t
的数量没有固有的限制-它们不必在任何地方集中注册。未锁定的互斥体只占用用于存储
pthread\u mutex\u t
的字节以外的资源


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

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

啊,这是新的!(嗯,相当新)。很有趣,谢谢你的链接谢谢,看起来也很有趣!听起来你会在核心之间得到很多分享。这可能会限制线程带来的性能提升。可能需要重新考虑是否有更好的方法来并行化代码,以便减少同步,减少线程之间的共享数据。实际上,是的,我可能会这样做。