gpt4 book ai didi

c++ - 需要设计建议 C++ : Want to implement a threaded queue for other threads to pass data

转载 作者:搜寻专家 更新时间:2023-10-31 01:58:24 25 4
gpt4 key购买 nike

我之前没有做过线程编程,所以想请教大家一些设计上的建议,以及线程编程需要注意的问题。

环境:MFC/C++、VS2005
问题:我有一个供应商库运行线程来轮询数据并从设备接收报告。根据设备的数量,线程数可以达到 100+。每次线程接收数据时,它都需要调用一系列函数(来自供应商 SDK,不是线程安全的)来更新 GUI 上的值。

解决方案??: 我的 friend 建议我使用带有内置队列的线程来同步更新数据到 GUI。每当其他线程收到数据时,它都会向该线程的队列中添加一个条目。然后该线程将调用函数序列,直到队列为空并等待新条目。

我阅读了 _beginthreadex()、_endthreadex()、boost::thread、信号量和互斥量概念。您认为我应该如何实现?我应该注意哪些陷阱?请指教。

最佳答案

我在 a previous answer 中发布了一些代码那应该是可用的。尽管那里的一些评论提到了 I/O 完成端口,但它们并不真正适用于您的情况。微软的尝试大致相同的是 SList,但是(IMO)这有一些非常严重的问题,首先是(IMO)一个致命缺陷的设计(或者,如果不是致命缺陷,至少完全不适合您的目的 - 以及大多数其他,无论如何)然后添加一些烦恼。致命的缺陷是它真的被设计成一个堆栈而不是一个队列1。对于您的应用程序来说,这几乎肯定是完全错误的。对于烦恼,QueryDepthSlist返回以 65536 为模的深度,因此,例如,如果您的深度为 65536,它会告诉您深度为零。其次,只有采取特殊步骤对齐放入列表的数据,它才能正常工作。这两个问题都可以解决(事实上,我犹豫是否要提及 QueryDepthSlist 的问题,因为您可能永远不应该调用它)但是对齐要求确实相当烦人。

至于如何创建其他线程,因为您显然在其他方面使用 MFC,您非常需要也使用 MFC 来创建您的线程——它做了一些额外的工作创建线程时的工作。如果要在特定线程中使用 MFC,则必须让 MFC 创建该线程。您可能希望使用原始线程来运行 GUI,并使用 AfxBeginThread 创建其他线程.

1 好吧,“致命”有点夸大了情况,但并没有夸大。基本上,您必须使用 InterlockedFlushSlist,然后向后遍历项目列表以按顺序处理它们。由于是单向链表,不能原样反向遍历。您可以递归地进行正向遍历,然后在返回部分进行处理,或者您可以在遍历列表时反转列表。虽然我确信任何一种都可以工作,但无论哪种方式,您基本上都是在反对设计。

关于c++ - 需要设计建议 C++ : Want to implement a threaded queue for other threads to pass data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4121067/

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