如何使用多线程使系统崩溃

How to crash system using Multithreading

本文关键字:系统 崩溃 多线程 何使用      更新时间:2023-10-16

我开始学习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/