【问题标题】:Thread Context Switching线程上下文切换
【发布时间】:2010-11-09 13:25:30
【问题描述】:

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

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

由于嵌入式环境的某些限制,我无法使用 Boost Threads。
任何关于上下文切换如何发生的建议和解释都会很有帮助。

【问题讨论】:

    标签: c++ c multithreading pthreads


    【解决方案1】:

    首先,您对线程的工作方式感到困惑。您不能随意切换线程上下文,操作系统会在需要时执行此操作。

    其次,如果您关心的是上下文切换开销,那么您做的事情非常错了。

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

    【讨论】:

    • 我了解事件驱动架构。其中一个会有一个事件驱动机制,其中所有线程都会将事件发布到主 Q 并从那里在主线程中删除事件并适当地处理它们,但我的 UI 框架中没有这个可用。一种方法是实现类似的东西,但如果可能的话,我正在寻找更好的选择
    • 关于上下文切换,可能我将前提置于文字的方式是错误的。当然,操作系统会负责将时间片分配给进程……线程……这都是非抢先的,我明白这一点。我的意思是我只想让我的 UI 线程处理 UI 部分,这意味着 UI 应该在 UI 线程的上下文中启动……我的困惑的话!
    • 您的 UI 工具包是否有处理文件/套接字或监控文件描述符的方法?如果没有,它是否至少提供某种形式的计时器或重复事件(以便您可以在线程完成时进行轮询)?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      让我试着用一个高水平的答案来帮助你。

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

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

      祝你好运

      【讨论】:

        猜你喜欢
        • 2011-07-23
        • 2017-09-09
        • 2011-07-27
        • 2012-01-12
        • 1970-01-01
        • 1970-01-01
        • 2018-04-18
        • 2014-12-05
        相关资源
        最近更新 更多