在没有等待的情况下在两个线程之间进行通信

时间:2017-11-12 10:40:31

标签: c++ multithreading boost lock-free

我正在处理一段代码,我需要在两个线程之间进行通信。问题是一个线程无法等待锁定。让我更详细地解释一下这个场景:

我正在运行模拟,其中一些实体在模拟中创建并在该模拟中更新其状态。另一方面,实体的状态在渲染引擎中呈现。

我的应用程序是一个渲染帧工作,它初始化渲染上下文,并且还负责启动一个新的模拟线程。

现在我需要设计在场景图中创建相应screne对象的代码。作为其中的一部分,我将需要在模拟创建所有实体时通知渲染引擎。渲染引擎创建场景对象后,模拟线程需要更新渲染引擎中场景对象的位置和方向。

因此,目前,模拟引擎有一种机制可以为不同的事件(对象创建,删除或移动)注册观察者,并且可以在触发这些事件时调用回调。

我需要设计允许如下内容的代码:

RENDERER                          SIMULATION
=========                        ============
Application starts
    |
Render context initialised
    |
    |----------------------------> Create simulation thread
    |                                   |
    |                               Created simulation objects
    |                                   |
    |<----- message objects created-----|
    |                                   |
 Created scene objects                  |                  
 based on simulation objects            |
    |                                   |
    |---notify scene objects created -> |
    |                                   |
    | <----- update scene objects ------|
    |
 Render updated states

实现此行为的建议之一是使用共享容器。

当模拟引擎创建所有实体时,它会使用这些对象填充列表。渲染引擎可以读取容器并创建相应的场景对象。创建场景对象后,渲染引擎会使用对象指针填充共享容器。然后,模拟引擎可以更新场景对象的状态。

现在,我不太确定实现这一目标的最佳方法是什么。有一件事是肯定的,如果我使用共享容器,线程不能等待其他线程完成写入。如果呈现线程检查共享容器并且它不为空,则它将忽略并将继续呈现。同时,如果模拟线程发现没有创建场景对象,它将忽略并继续模拟循环。

我正在使用Boost Thread。有关设计的任何建议吗?

0 个答案:

没有答案