首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MFC中实现多线程以更新外部函数可访问的内部字典

在MFC中实现多线程以更新外部函数可访问的内部字典
EN

Stack Overflow用户
提问于 2011-12-21 01:54:16
回答 1查看 688关注 0票数 0

我正在与C++和MFC合作创建一个可以从彭博社实时获取信息的应用程序。Bloomberg API有一个subscription类,它将“订阅”来自Bloomberg的更新,并将它们实时推送到我的PC上,因此我需要在线程中运行eventloop来处理Bloomberg数据。

为了节省带宽,我希望使用字典将bloomberg股票代码映射到它的最后价格,这样程序将在字典中进行查找,而不是为同一股票代码获得多个结果(即,我在多次使用相同的股票代码)。这样,我只需要订阅不同的报价器。

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

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

这个字典是被线程锁住的吗?我可以在更新时安全地访问它吗?

我可以让线程在后台运行,直到程序终止吗?当我终止程序时,我是否需要显式地杀死线程,或者它将自动完成?

这听起来对吗,或者我遗漏了一些基本的东西?

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

然而,现在,它还不是“线程安全的”。只有一个线程向CMap写入数据,而其他所有线程都只是读取CMap中的数据,所以就目前而言,这并不是什么大问题。

但是,为了学习良好的编程实践,我应该在向CMap?CEvent应该传递到线程中吗?我不确定这是如何实现的。我在谷歌上快速搜索了一下,我没有找到任何我理解的关于如何锁定和解锁线程中的变量的东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-21 02:46:44

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

代码语言:javascript
复制
// for example, HINT CCriticalSection, or CSemaphore
mutex.lock();
dictionary.add(...);
mutex.unlock();

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

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

代码语言:javascript
复制
// for example, HINT CEvent
while(!stopped)
{
   do_work();
}

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

对于初学者来说,可以通读一下here。老实说,尽管这些都是非常基本的问题,但请准备好真正花时间好好学习这些东西。如果编写适当的多线程代码很容易,每个人都会这么做。

至于我提到的特定同步类,它们是有文档记录的here

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8579737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档