我正在处理一段代码,我需要在两个线程之间进行通信。问题是一个线程无法等待锁定。让我更详细地解释一下这个场景:
我正在运行模拟,其中一些实体在模拟中创建并在该模拟中更新其状态。另一方面,实体的状态在渲染引擎中呈现。
我的应用程序是一个渲染帧工作,它初始化渲染上下文,并且还负责启动一个新的模拟线程。
现在我需要设计在场景图中创建相应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。有关设计的任何建议吗?