首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 多線程嵌套創建與並發運行機制詳解

     編輯:程式設計綜合問答

核心結論

線程可以嵌套創建,所有線程並發運行。子線程內創建的新線程與父線程、主線程同層級,由操作系統調度器統一管理,無父子依賴關係。

代碼示例

#include <thread>
#include <iostream>

void worker(int id) {
    std::cout << "Thread " << id << " running on " << std::this_thread::get_id() << '\n';
    std::this_thread::sleep_for(std::chrono::seconds(1));
}

void parent_thread() {
    std::cout << "Parent thread start\n";
    std::thread t1(worker, 1); // 在子線程中創建新線程
    std::thread t2(worker, 2);
    t1.join();
    t2.join();
    std::cout << "Parent thread end\n";
}

int main() {
    std::thread t(parent_thread);
    t.join();
    return 0;
}

關鍵注意點

  1. 資源管理:每個 std::thread 對象必須 join() 或 detach(),否則析構時觸發 std::terminate。
  2. 數據競爭:多線程訪問共享數據必須同步(mutex、atomic、無鎖結構)。
  3. 異常傳播:子線程異常不會自動傳播到父線程,需自行捕獲並通過 std::promise/future 傳遞。
  4. 線程池優化:頻繁創建銷毀線程開銷大,高並發場景應使用線程池(boost::thread_pool、C++17 std::experimental::execution 或自研)。

常見誤區澄清

誤區事實
子線程結束會自動結束其創建的孫線程錯。線程獨立,孫線程繼續運行直至各自 join/detach
嵌套創建會導致死鎖錯。死鎖源於鎖順序,與創建層級無關
主線程結束程序即退出對。但若有非守護線程未結束,進程仍存活(C++ 無守護線程概念,需自行 join)

「線程是獨立的執行流」,拋開創建者視角,所有線程在調度器眼中平等。設計時關注同步與生命周期管理,而非創建層級。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved