gpt4 book ai didi

multithreading - 如何在模型和 View 之间共享数据?

转载 作者:行者123 更新时间:2023-12-03 10:55:51 25 4
gpt4 key购买 nike

我目前正在重新设计一个应用程序,该应用程序将根据输入数据构建模型,并将该数据显示给用户。当前系统具有用于构建模型的线程,用于构建模型的可视化的线程以及用于显示可视化的线程。我的问题是在建模和可视化线程之间传递了指针-为了使线程安全,模型中的所有对象都必须具有互斥量。这意味着系统中有成千上万的互斥体处于 Activity 状态,并且由于两个线程都在争用资源,因此有很多停顿。

那么,鉴于这三个线程将存在,以高效且线程安全的方式在建模和可视化线程之间共享数据的最佳方法是什么?一些数据结构很大,并且会在建模线程的每个循环中改变,因此我不愿每次通过都复制数据。

编辑:

我们希望通过该系统的总延迟时间是:从接收到一条消息到显示该显示屏变化的显示屏大约有100ms。我们希望它尽可能快一些,但是更重要的是我们需要它保持一致-由于互斥锁的争夺,现在我们看到周期时间的巨大变化。从建模到可视化的数据主要由2D高度图-约18000个单元格的数据构成。但是,模型更新中更新的实际单元格数量却少得多-也许只有几百个。

最佳答案

我是消息发布/消息泵体系结构的忠实拥护者。这是MFC/Win32提供的在线程之间通信数据的主要方法。此体系结构是事件驱动的线程消息,因此,当接收线程正在处理线程消息时,它正在处理为线程之间的通信而显式更新的数据(请参见下面的示例)。

您可以自己实现,并将锁定本地化到每个线程的线程消息列表。因此,当一个线程想要向另一个线程发送消息时,您可以大致执行以下操作

PostThreadMessage(msg, void* param, int paramSize)
{
lock(msgQueueLock);

// may wish to copy param
char paramCpy = malloc
msgQueue.Queue(msg, pparam, paramSize);

unlock(msgQueueLock);
}

那么任何线程的主循环就是
// thread's msg pump
while (1)
{
// can also use condition var to wait for queue to change...
lock(msgQueueLock);
HandleMsgLocally(msgQueue.Deque())
unlock(msgQueueLock);
}

无论如何,回到MVC,如果您的模型发生某些变化,它可以发布到 View 中以更新特定字段,例如:
// Well known msg name
int msgName = MODEL_FIELD_A_UPDATED

...

void Model::UpdateFieldA(int newVal)
{
int* valToCommunicate = new int(newVal)
PostThreadMessage(MODEL_FIELD_A_UPDATED, valToCommunicate, sizeof(int))
}


...
void HandleMsgLocally(...void * param,)
{
if (msg == MODEL_FIELD_A_UPDATED)
{
int* val = reinterpret_cast<int*>(param);
//... process param
delete val;
}
}

优点是您可以本地化锁定。这是巨大的。同样,只要发送方明确理解该参数为新参数,而接收方将其删除,则不必担心访问共享内存。

这样做有很多缺点,延迟是其中之一。如果您需要立即知道发生了某些更改,则需要实际制作共享数据并考虑最佳的锁定方案。如果您确实需要一个可以随时从多个方向进行更新的全局状态,那么在我的书中,这种情况下可以使用单例。这种设计实际上最适合单向数据,您可以进入竞争条件。但是,您也许还可以实现锁定 getter ,以供一个线程从另一个线程进行检查,但可以设置必须发布的值。有很多变量需要考虑,但是希望这可以对您有所帮助。同样,您可以忘记删除消息中的参数。

基于“编辑”进行更新
根据您的信息,根据数据量,过帐可能会很好。分析您的代码很重要。如果您是我,我会打些概念证明,然后转向使用条件变量来管理同步性。如果您使用的是Windows平台,请绝对使用其消息泵。

关于multithreading - 如何在模型和 View 之间共享数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/557675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com