0

我正在使用 C++ 和 MFC 创建一个应用程序,该应用程序将实时从 Bloomberg 中提取信息。Bloomberg API 有一个订阅类,它将“订阅”来自 Bloomberg 的更新并将它们实时推送到我的 PC,因此我需要在线程中运行一个事件循环来处理 Bloomberg 数据。

为了节省带宽,我想使用字典将Bloomberg股票代码映射到它的最后价格,所以不是为同一个股票代码获得多个结果(即我多次有相同的股票代码),程序会做一个在字典中查找。这样,我只需要订阅不同的代码。

我以前没有使用过多线程,我一直在阅读 MSDN 中的文档,但是我在理解我需要做什么时遇到了很多麻烦。

根据我的理解,我需要使用 AfxBeginThread() 创建一个工作线程,并传入一个指向字典实例的指针。工作线程将在我的程序的其余部分运行时更新字典。

这本字典被线程锁定了吗?我可以在更新时安全地访问它吗?

我可以让线程在后台运行直到程序终止吗?终止程序时是否需要显式终止线程还是会自动完成?

这听起来对吗,还是我错过了一些基本的东西?

所以我创建了一个 CMap(CString,LPCSTR,double, double) 来存储代码和定价。我通过 LPVOID 传递一个指向 CMap 的指针,并且 CMap 得到实时更新。现在一切正常。我可以在 CMap 中查找变量并获得实时定价。

但是,现在,它不是“线程安全的”。只有一个线程向 CMap 写入数据,其他一切都只是读取 CMap 中的数据,所以现在,这没什么大不了的。

但是,为了学习良好的编程实践,我应该在写入 CMap 时使用 CEvent 吗?CEvent 应该被传递到线程中吗?我不确定这是如何实现的。我做了一个快速的谷歌搜索,我没有找到任何我理解的关于如何在线程中锁定和解锁变量的信息。

4

1 回答 1

1

任何不是专门设计为线程安全的对象都不是这样。因此,您将需要一些互斥对象来保护您的“字典”的访问:

// for example, HINT CCriticalSection, or CSemaphore
mutex.lock();
dictionary.add(...);
mutex.unlock();

CSemaphore虽然在上述情况下文档会建议 a ,但CCriticalSection(在我看来)对于初学者来说更容易理解。

您的应用程序启动的线程应该由您的应用程序停止,是的。您可以通过向线程发出工作已完成的信号来执行此操作:

// for example, HINT CEvent
while(!stopped)
{
   do_work();
}

并在应用程序退出时设置停止事件。

对于初学者,请阅读此处。老实说,虽然这些都是非常基本的问题,所以要准备好花时间好好学习这些东西。如果编写适当的多线程代码很容易,那么每个人都会这样做。

至于我提到的具体同步类,这里有文档。

于 2011-12-20T18:46:44.127 回答