【发布时间】:2011-02-12 13:08:20
【问题描述】:
我有一个线程池,其中包含一些线程(例如,与内核数量一样多)可以处理许多对象,比如数千个对象。通常我会给每个对象一个互斥锁来保护对其内部的访问,当我工作时锁定它,然后释放它。当两个线程试图访问同一个对象时,其中一个线程必须等待。
现在我想节省一些资源并具有可扩展性,因为可能有数千个对象,但仍然只有一个满手的线程。我正在考虑一种类设计,其中线程具有某种互斥锁或锁定对象,并在应该访问对象时将锁定分配给对象。这将节省资源,因为我拥有的锁对象数量与线程数量一样多。
现在是编程部分,我想将这个设计转换为代码,但不知道从哪里开始。我正在用 C++ 编程,并希望尽可能使用 Boost 类,但处理这些特殊要求的自写类是可以的。我将如何实现它?
我的第一个想法是每个线程都有一个 boost::mutex 对象,每个对象都有一个 boost::shared_ptr 最初是未设置的(或 NULL)。现在,当我想访问该对象时,我通过创建一个 scoped_lock 对象并将其分配给 shared_ptr 来锁定它。当 shared_ptr 已经设置时,我等待当前的锁。这个想法听起来像是一堆竞争条件,所以我有点放弃了它。有没有另一种方法来完成这个设计?完全不同的方式?
编辑: 上面的描述有点抽象,所以我添加一个具体的例子。想象一个有许多对象的虚拟世界(想想> 100.000)。在世界中移动的用户可以在世界中移动并修改对象(例如向怪物射箭)。当只使用一个线程时,我很适合对对象的修改进行排队的工作队列。不过,我想要一个更具可扩展性的设计。如果有 128 个核心处理器可用,我想使用全部 128 个,所以使用那个数量的线程,每个线程都有工作队列。一种解决方案是使用空间分离,例如对一个区域使用锁。这可以减少使用的锁的数量,但如果有一种设计可以节省尽可能多的锁,我会更感兴趣。
【问题讨论】:
标签: c++ multithreading boost synchronization