如何使用多线程使系统崩溃
How to crash system using Multithreading
我开始学习c++多线程,我试图通过占用所有处理器来崩溃和阻塞我的系统。事实上,我尝试创建许多线程并运行它们,但我没有得到我需要的
void func()
{
std::cout << "C++11 MULTITHREADINGn";
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的回答所指出的,你需要创建更少的线程来避免系统错误。
你不能期望成功创建很多(例如数百万)线程(例如,因为每个线程需要一些调用堆栈空间,通常每个线程需要几兆字节)。通常只能创建几百个或几千个线程。所以INT_MAX
是不合理的,对于线程的数量(1000或100应该足够)。
线程是相当昂贵的资源,可能比打开的文件描述符更重。在实践中,您只需要十几个线程。
如果你想让你的计算机过载,你不应该在创建线程后马上加入它。你想让所有线程并行运行,并在每个线程创建后连接。
因此使用Nathan Oliver的答案,但在添加
后将MY_THREADS_MAX
替换为INT_MAX
#define MY_THREADS_MAX 1000
(或者更少,可能50
应该足够了)
如果在Linux上,请参见setrlimit(2);可能,默认限制禁止您崩溃系统(除非您是根用户),但可能会使系统无响应。
在您的系统中,您可能需要特殊的管理员权限才能使计算机崩溃。
正如@NathanOliver建议的那样,您将希望完成程序的运行,而不仅仅是将其分离。
但是您也应该考虑使用高优先级进程。这个实现是特定于平台的,但是您可以查看一些很好的答案:
什么是'realtime'进程优先级设置?或http://www.nixtutor.com/linux/changing-priority-on-linux-processes/
- 当回溯以零开始时,如何调试崩溃
- C++,系统无法执行指定的程序
- 在UNIX系统中使用DIR查找文件的字节大小
- 内联映射初始化的动态atexit析构函数崩溃
- 为什么此C 程序会导致系统崩溃
- 当功能返回时,Linux C 系统()调用崩溃
- OSX-Qt应用程序在接收系统事件QEvent::FileOpen时崩溃
- 应用程序在非开发系统上崩溃
- GNU 4.8.1系统更新后,任何C++编译都会崩溃
- 动态阵列导致系统崩溃
- Qt串行端口程序在另一个系统上运行时崩溃
- 在 Mac 上使用 boost::文件系统连接文件路径时程序崩溃
- QMediaPlayer 和 gstreamer 系统崩溃
- c++全系统崩溃,仅发布模式
- VS2012,使用系统函数调用exe,这会导致崩溃
- Linux:系统保护,防止c++和FORTRAN程序经常崩溃
- 如何使用多线程使系统崩溃
- 64位系统中的程序崩溃
- 访问计算机指针时发生访问冲突(c系统异常代码:c0000005),导致应用程序崩溃
- 如何以编程方式使系统崩溃