簡體   English   中英

如何使用多線程使系統崩潰

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM