线程上下文切换

时间:2010-11-09 13:25:30

标签: c++ c multithreading pthreads

我正在开发一个涉及UI和后台服务的C / C ++项目,该项目通过网络获取数据来进行一些繁重的处理。为了使我的UI不会无响应,我想生成一个单独的线程,然后在该线程中调用后台服务,而另一个线程将在UI中显示忙碌指示。一旦后台服务完成了它的工作,我就想将线程上下文从后台线程切换到UI线程,这样就可以删除忙碌指示并显示更多的屏幕流。 我相信这是大多数UI工作的常用方式。我想知道的是实现这一目标的有效和最佳方法是什么。现在我没有为上面实现的代码,我只是在寻求想法和最佳方法。

该平台是Linux。 我正在使用的UI框架是一个自定义UI框架,它提供了一个用于UI开发的SDK,但与大多数UI框架不同,它不会为我提到的场景提供任何内容。它几乎已经被弃用了,但需要用于这个项目,这是一个痛苦,所以唯一的选择是我可以使用Pthread或System v与实际调用的一些包装器,这将帮助我保持实现在不同平台上的可移植性。

由于嵌入式环境的某些限制,我无法使用Boost Threads 关于如何进行上下文切换的任何建议和解释都将非常有用。

3 个答案:

答案 0 :(得分:6)

首先,您对线程如何工作感到困惑。您不能随意切换线程上下文,操作系统会在任何时候都这样做。

其次,如果您的担忧是上下文切换开销,那么您正在做一些非常错误。

最后,UI通常具有事件驱动的体系结构。通常,您有一个“主”线程运行一个事件循环来处理各种事件。因此,执行所需操作的正确方法是让后台线程将进度事件发布到“主”线程。而且你必须以线程安全的方式做到这一点;具体细节取决于UI工具包。

答案 1 :(得分:0)

我有一个sample code来创建和使用pthreads的线程和互斥。示例中的线程同时锁定互斥锁/增量变量/解锁互斥锁。您可能需要的一个缺失位是条件变量(相同的初始化模式),然后将为基于pthread的任务运行程序线程实现提供完整的最小必需原语集。而且你不会依赖任何第三方图书馆。

答案 2 :(得分:0)

让我试着帮助你提供高水平的答案。

 您确实可以查看posix线程(一个用于UI,一个或多个用于后端处理)。当然,你需要在它们之间进行同步;这意味着还要查看互斥,volatile关键字或自旋锁等主题。

根据您对每个人的舒适程度,尝试在过去的问题中搜索这些主题。

祝你好运