[英]How to crash system using Multithreading
我开始学习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;
}
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的 答案指出的那样,您将需要创建更少的线程来避免系统错误。
您不能指望成功创建大量(例如数百万个) 线程 (例如,因为每个线程都需要一些调用堆栈空间,每个线程通常需要几兆字节)。 通常,您只能创建数百个或数千个线程。 因此对于线程数(1000或100应该足够), INT_MAX
是不合理的。
线程是非常昂贵的资源,可能比打开的文件描述符还要重。 实际上,您只需要十几个线程。
然后,如果您想使计算机过载,则不应在创建线程后立即加入该线程。 您希望所有线程并行运行,并在创建每个线程后加入。
因此,请使用Nathan Oliver的答案,但在添加INT_MAX
MY_THREADS_MAX
替换为MY_THREADS_MAX
#define MY_THREADS_MAX 1000
(甚至更少,大概50
应该足够了)
如果在Linux上,另请参见setrlimit(2) ; 可能是,默认限制禁止您使系统崩溃(除非您是root用户),但可能会使它无响应。
可能会发生在系统上,您需要特殊的管理员特权才能使计算机崩溃。
正如@NathanOliver所建议的那样,您将要完成程序的运行,而不仅仅是分离它。
但是,您还应该考虑使用高优先级的过程。 该实现是特定于平台的,但是您可以检查出一些好的答案:
“实时”过程优先级设置是什么? 或http://www.nixtutor.com/linux/changing-priority-on-linux-processes/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.