【发布时间】:2018-04-27 15:21:09
【问题描述】:
我正在尝试实现多线程设计,需要线程同步方面的帮助。
我有两个类,A 类和 B 类。我将使用伪代码进行解释 A 类是在 main 函数中创建的。
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 类使用 boost 信号槽机制将 B 类中的信号 (signalEntityCreated) 与 A 类中的本地成员函数连接起来。 在 B 类中,回调调用信号以触发 A 类中的成员函数调用。在本例中为 addEntity,即向 std::list 添加新条目。
A类有一个tick函数,每帧都tick,需要处理addEntity函数添加的任何实体。
现在,我需要正确同步这个生产和消费实体机制。 A类在主线程中运行,并且绑定到渲染线程,所以它不能等待互斥锁(长时间)否则渲染性能会降低。
我的观察, 当模拟在不同线程中运行时,所有回调都属于该线程。当使用 boost::signal 调用成员函数时,该成员函数也在模拟线程中运行。但是,处理(tick 内部)需要在主线程中运行。
有什么建议吗?
【问题讨论】:
-
tick在哪里调用?将来请让示例“真实”且独立(A或B之类的名称只会使有经验的开发人员感到困惑并删除许多有用的线索)
标签: c++ multithreading boost boost-thread