如何使用多线程崩溃系统

时间:2015-08-31 12:26:08

标签: c++ 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;
}

3 个答案:

答案 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/