我开始学习C ++中的多线程,我试图通过占用所有处理器来崩溃并阻止我的系统。事实上,我试图创建许多线程并运行它们,但我没有得到我需要的东西
void func()
{
std::cout << "C++11 MULTITHREADING\n";
for (int i = 1; i < INT_MAX; i++)
{
for (int j = 1; j < INT_MAX; j++)
std::cout << i / j << " ";
}
}
int main()
{
for (int i = 0; i < INT_MAX; i++)
{
std::thread t(func);
t.join();
}
std::cout << " ***END OF A PROGRAM***\n";
return 0;
}
答案 0 :(得分:4)
t.join();
将刚刚创建的线程“加入”到当前线程中。这意味着您将在创建下一个线程之前运行整个函数并返回。这与做:
相同for (int i = 0; i < INT_MAX; i++)
{
func();
}
如果你想生成多个线程并运行它们,然后将它们存储在std::vector
中,然后在创建它们之后再调用join()
。
std::vector<std::thread> threads;
threads.reserve(INT_MAX); // save reallocations
for (int i = 0; i < INT_MAX; i++)
{
threads.push_back(std::thread(func));
}
for (int i = 0; i < INT_MAX; i++)
{
threads[i].join();
}
由于Basile Starynkevitch's answer指出您需要创建更少的线程以避免系统错误。
答案 1 :(得分:2)
您不能指望成功创建很多(例如数百万)threads(例如,因为每个线程需要一些call stack空间,通常每个线程几兆字节)。您通常只能创建几百个或几千个线程。所以- (void)secondLabel
{
secondLabelBox.text = @"Apple";
}
- (void)thirdLabel
{
thirdLabelBox.text = @"World";
}
是不合理的,因为线程的数量(1000或100应该足够)。
线程是一个非常昂贵的资源,可能比打开file descriptor更重。在实践中,您只需要十几个线程。
然后,如果您想重载计算机,则不应在创建计算机后立即加入该计算机。您希望所有线程并行运行,并在每个线程创建后加入。
因此请使用Nathan Oliver's answer,但在添加
后将INT_MAX
替换为INT_MAX
MY_THREADS_MAX
(甚至更少,可能 #define MY_THREADS_MAX 1000
应该绰绰有余)
如果在Linux上,请参阅setrlimit(2);可能,默认限制禁止您崩溃系统(除非您是root用户)但可能会使其无响应。
可能会发生在您的系统上,您需要特殊的管理员权限才能使您的计算机崩溃。
答案 2 :(得分:1)
正如@NathanOliver建议你想要完成程序的运行而不是仅仅分离它。
但您还应考虑使用高优先级流程。此实现是特定于平台的,但您可以查看一些好的答案:
What is the 'realtime' process priority setting for?或 http://www.nixtutor.com/linux/changing-priority-on-linux-processes/