繁体   English   中英

Boost :: thread如何在主线程和辅助线程之间进行同步?

[英]Boost::thread how to synchronise between main and worker thread?

我正在尝试实现多线程设计,并且在线程同步方面需要一些帮助。

我有两个类,即A类和B类。我将说明使用伪代码在主函数中创建类A。

class A
{
   public:
   A();
   ~A();

   void tick();
   void addEntity();
   private:
   std::list<entity> entityList;
   B* _b;
};

B类如下:

 class B
{
   public:
   B();
   ~B();

   void createSimulation();
   void startSimulation();
   void registerCallbacks(SimEngine& sim);
   void entityCreatedCallback();

   boost::signal<void()> signalEntityCreated;

   private:
   simEngine* sim;


};

A类实现有点像:

A::A()
{
    _b = new B();
    _b->signalEntityCreated.connect(boost::bind(&A::AddEntity, this));
    _b->createSimulation();
}

A::~A()
{

}

void A::tick()
{
    entity ent = entityList.pop_front();
    //process the entity
}


void A::addEntity(entity ent)
{
     entityList.push_back(entity);
}

B类的实现有点像这样:

B::B()
{
}

B::~B()
{
}

 B::registerCallback(SimEngine& sim)
 {
     sim.connect("ENTITY_CREATED", entityCreatedCallback);
 }

 void B::createSimulation()
 {
     boost::thread sim_thread(boost::bind(&B::startSimulation, this));
 }


 void B::startSimulation()
 {
      sim =  new SimEngine();
      registerCallback(sim);

      sim->start();

 }

 void B::entityCreatedCallback(simEngine& sim)
{
    signalEntityCreated(sim.lastEntity);
}

因此,主要思想是A类创建B类,B类又启动一个模拟线程。 在开始模拟之前,它会在模拟中注册一些回调函数。 当模拟中的某些状态发生变化(即创建的实体)时,将调用这些回调函数。

类A使用升压信号时隙机制将类B中的信号(signalEntityCreated)与类A中的本地成员函数连接。在类B中,回调该信号以触发类A中的成员函数调用。在这种情况下,addEntity正在将新条目添加到std :: list。

类A具有一个滴答函数,该滴答函数会在每个帧中滴答,并且需要处理addEntity函数添加的任何实体。

现在,我需要正确同步此生产和消费实体机制。 类A在主线程中运行,并且绑定到渲染线程,因此它不能长时间等待互斥量,否则渲染性能可能会降低。

我的观察,当模拟在不同的线程中运行时,所有回调都属于该线程。 当使用boost :: signal调用成员函数时,该成员函数也在模拟线程中运行。 但是,处理(内部滴答)需要在主线程中运行。

有什么建议吗?

您只想创建一个从呈现事件循环中轮询的消息队列。

此外,您可以对模拟进行建模,也可以按照“活动对象模式”¹进行渲染器( A )。

请注意,在跨线程边界传递事件消息时,您也将希望传递实体,因为否则将存在竞争条件(在处理事件之前已创建多个实体时)。


¹见,例如- https://en.wikipedia.org/wiki/Active_object - http://www.drdobbs.com/parallel/prefer-using-active-objects-instead-of-n/225700095 - - HTTPS:/ /rosettacode.org/wiki/Active_object#C.2B.2B实际上是一个很好的例子

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM