【发布时间】:2016-05-02 18:54:10
【问题描述】:
我有一个主线程来做一些不那么繁重的工作,而且我正在创建工作线程来做非常繁重的工作。所有文档和示例都展示了如何创建数量等于std::thread::hardware_concurrency() 的硬件线程。但由于主线程已经存在,线程数变为std::thread::hardware_concurrency() + 1。例如:
- 我的机器支持 2 个硬件线程。
- 在主线程中,我创建了这 2 个线程,线程总数变为 3。
- 一个带有主线程的内核完成它的工作加上(可能)工作线程的工作。
我当然不希望这样,因为 UI(在主线程中完成)由于延迟而变得没有响应。如果我创建std::thread::hardware_concurrency() - 1 线程会发生什么?它会保证主线程和唯一的主线程在单核上运行吗?如何查看?
P.S.:我正在使用某种池 - 我在程序启动时启动线程并在退出时停止。在执行过程中,所有工作线程都会无限循环while。
【问题讨论】:
-
您无法得到任何保证,即使您的线程数少于硬件支持的线程数。如果机器上正在运行其他程序怎么办?这取决于它实际运行线程的操作系统。您可以通过平台特定的行为获得一些改进。你的目标是什么平台?
-
让操作系统决定什么是最好的有什么问题?为什么你认为你能够做出比它更好的决定?
-
我使用的是 Windows 7/8/10。而且我认为我不能比 OS 做得更好,我只是希望我的程序运行顺畅。
-
@nikitablack 只需确保您没有在无限循环中忙于等待。如果你在等待工作,你应该使用条件变量。
-
假设您没有在 UI 事件处理程序中做诸如等待/轮询之类的坏事,只需降低工作线程的优先级,以便 UI 在准备就绪时始终可以获取 CPU。 Prabindh 提出了这个建议,这是一个比搞乱核心亲和力更好、更简单的解决方案。
标签: c++ multithreading c++11