- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试了解std::thread
中的一些基本概念,但我对此仍然没有信心。潜在的问题是:
当我超过 std::thread::hardware_concurrency()
的值时,实际发生了什么,就像我在下面所做的那样?
我知道这个方法只是一个提示,但在这种情况下 8 应该是准确的。我没有看到任何警告或错误,那么实际发生了什么?
我怀疑这与我对 join()
和 detach()
缺乏理解有关,这引出了我的第二个问题。
我知道,如果我在没有 join()
或 detach()
的情况下启动线程,我将遇到运行时错误。正如我从阅读和观察中了解到的那样,join()
导致线程阻塞,直到它完成执行,而 detach()
基本上相反,允许线程疯狂运行直到它完成,如果该线程不自行终止,则可能会打开一堆蠕虫。
根据我的观察,似乎 join()
和 detach()
的用法是互斥的。这是错误的吗?为什么我需要在同一线程上使用 join()
和 detach()
?
就我的第一个问题而言,我什至无法开始猜测。我预计会出现某种类型的运行时错误,或者更明显的强制阻塞。
#include <ctime>
#include <cstdlib>
#include <iostream>
#include <thread>
#include <vector>
std::vector<unsigned> getNumbers(unsigned n)
{
std::vector<unsigned> out;
while(n > 0)
{
out.push_back(rand());
n--;
}
return out;
}
int main() {
srand(time(nullptr));
std::vector<std::thread> threads;
unsigned maxThreads = std::thread::hardware_concurrency();
std::cout << "Max threads: " << maxThreads << std::endl;
unsigned tooManyThreads = maxThreads + 5;
for(auto i = 0; i < tooManyThreads; i++)
{
threads.push_back(std::thread(getNumbers,(rand() % 10000 + 1)));
std::cout << "Starting thread " << i << " ("
<< threads.back().get_id() << ")" << std::endl;
threads.back().detach();
}
for(auto i = 0; i < tooManyThreads; i++)
{
if(threads.at(i).joinable())
{
threads.at(i).join();
std::cout << "Joining " << i << std::endl;
}
}
return 0;
}
最佳答案
您似乎对“线程”在这种情况下的含义感到困惑。有两种线程:std::thread
是一个 software thread。 ,而 std::thread::hardware_concurrency()
返回 hardware threads 的数量.
软件线程不需要专用的硬件线程,操作系统可以并且将调度不同的软件线程来共享相同的硬件线程。事实上,软件线程通常比机器上的硬件线程多几个数量级。
关于c++ - std::thread 最大并发线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55930628/
我是一名优秀的程序员,十分优秀!