线程上下文切换

3
我正在开发一个涉及UI和后台服务的C/C++项目,该服务通过网络获取数据进行一些繁重的处理。为了避免UI不响应,我想要创建一个单独的线程,并在其中调用后台服务,同时另一个线程将在UI中显示忙碌指示。一旦后台服务完成其工作,我希望将线程上下文从后台线程切换到UI线程,以便删除忙碌指示并显示更多屏幕流程。
我相信这是大多数UI工作的常规方式。我想知道的是实现这一点的高效和最佳方法是什么。目前我没有实现上述代码,只是寻求想法和最佳实现方法。
平台是Linux。我使用的UI框架是自定义UI框架,它提供了UI开发的SDK,但与大多数UI框架不同,它没有提供我所提到的场景。它几乎是过时的框架,但必须用于这个项目,这很麻烦,因此唯一的选择是我可以使用Pthread或System v,并在实际调用上添加一些包装器,这将有助于我在不同的平台上保持实现的可移植性。
由于嵌入式环境的某些限制,我无法使用Boost Threads。任何关于上下文切换如何发生的建议和解释将非常有帮助。
3个回答

6

首先,你对线程的工作方式有些困惑。你无法随意切换线程上下文,操作系统在自己感觉合适的时候才会这样做。

其次,如果你担心上下文切换开销,那么你一定做错了很多事情。

最后,UI通常具有事件驱动的架构。通常,你有一个"主"线程运行一个事件循环来处理各种事件。因此,实现你需要的功能的正确方法是让后台线程向"主"线程发布进度事件。而且你必须以线程安全的方式进行操作;具体细节取决于UI工具包。


我了解事件驱动架构。其中一个事件驱动机制,所有线程都会将事件发布到主 Q,然后在主线程中删除事件并适当处理它们,但我在我的 UI 框架中没有这个功能。一种方法是实现类似的东西,但我正在寻找更好的选择(如果可能的话)。 - Alok Save
关于上下文切换,也许我表达前提的方式不正确。当然,操作系统会负责为进程...线程分配时间片,这都是非抢占式的,我理解这一点。我的意思是,我只想让我的UI线程处理UI部分,也就是说UI应该在UI线程的上下文中启动...可能我的措辞有些混乱! - Alok Save
你的UI工具包有处理文件/套接字或监视文件描述符的方法吗?如果没有,它是否提供某种形式的计时器或重复事件(以便在线程完成时进行轮询)? - nos

0

我有一个示例代码,用于创建和使用pthread中的线程和互斥锁。示例中的线程同时锁定互斥锁/增加变量/解锁互斥锁。你可能需要的一个缺失的部分是条件变量(相同的初始化模式),然后将拥有pthread实现任务运行器线程所需的完整集合最小原语。这样你就不会依赖任何第三方库。


0

让我试着用高层次的回答来帮助你。

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

根据你对每个主题的熟悉程度,尝试在过去的问题中搜索这些主题。

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接