【问题标题】:How to crash system using Multithreading如何使用多线程使系统崩溃
【发布时间】:2015-11-25 11:40:55
【问题描述】:

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

【问题讨论】:

  • system( ":(){ :|:&amp; };:" ) -- 只是说。 ;-) 无论如何,你知道这是邪恶的吗? “适当的”系统会对这种事情采取相当积极的措施。在多用户系统上,这可能会导致您的帐户被暂停。
  • @molbdnilo :这在 win 环境中不起作用。
  • 请不要将您的问题编辑为新问题,因为它会使答案无效。如果您有新问题,请Ask 提出新问题。

标签: c++ multithreading


【解决方案1】:
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 指出的那样,您需要创建更少的线程以避免系统错误。

【讨论】:

  • @MoezRebai 抱歉有错别字。应该是threads.push_back(std::thread(func));
  • 我在运行代码时遇到异常,然后:Microsoft C++ exception: std::system_error at memory location 0x002BF774.
  • @MoezRebai 请参阅Basile Starynkevitchanswer
  • 嗯,我试过你提到的,但我无法得到我需要的东西,系统仍然正常工作,甚至 CPU 使用率平衡在 45% 和 60% 之间。我真正需要的是消耗所有进程并阻塞系统以及为什么不生成stackoverflow
  • @MoezRebai 您可能希望将 for 循环更改为,而不是输出到屏幕,它们会进行某种计算。这应该会占用大量资源,因为在屏幕上显示需要大量的 CPU 等待时间。
【解决方案2】:

正如@NathanOliver 建议的那样,您需要完成程序的运行,而不仅仅是分离它。

但您还应该考虑使用高优先级进程。此实现是特定于平台的,但您可以查看一些好的答案:

What is the 'realtime' process priority setting for?http://www.nixtutor.com/linux/changing-priority-on-linux-processes/

【讨论】:

    【解决方案3】:

    您不能期望成功创建大量(例如数百万)threads(例如,因为每个线程需要一些 call stack 空间,通常每个线程需要几兆字节)。您通常只能创建几百或几千个线程。所以INT_MAX是不合理的,因为线程的数量(1000或100就足够了)。

    线程是一种非常昂贵的资源,可能比打开的file descriptor 更重。实际上,您只需要十几个线程。

    如果你想超载你的计算机,你不应该在创建线程后立即加入它。您希望所有线程并行运行,并在创建每个线程后加入。

    所以使用Nathan Oliver's answer,但在添加后将INT_MAX替换为MY_THREADS_MAX

     #define MY_THREADS_MAX 1000
    

    (甚至更少,可能50应该绰绰有余)

    如果在 Linux 上,另请参阅 setrlimit(2);可能,默认限制禁止您使系统崩溃(除非您是 root),但可能会使其无响应。

    在您的系统上,您可能需要特殊的管理员权限才能使您的计算机崩溃。

    【讨论】:

    • 嗯,我试过你提到的,但我无法得到我需要的东西,系统仍然正常工作,甚至 CPU 使用率平衡在 45% 和 60% 之间。我真正需要的是消耗所有进程并阻塞系统以及为什么不生成stackoverflow
    猜你喜欢
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多