日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機 > 程序喵大人

在 C++11 引入的 std::thread 中,每個線程對象在其生命周期結(jié)束前必須調(diào)用 join()detach() 方法之一。這兩個方法代表了兩種不同的線程管理策略。

本文僅代表個人觀點

join()

join() 方法會阻塞當(dāng)前線程,直到被調(diào)用的線程執(zhí)行完成。調(diào)用 join() 后,主線程會等待子線程結(jié)束,然后繼續(xù)執(zhí)行。

特點

  • 阻塞性:調(diào)用 join() 的線程會被阻塞,直到目標(biāo)線程完成
  • 資源回收:線程結(jié)束后,系統(tǒng)會自動回收線程資源
  • 同步機制:提供了線程間的同步點,確保子線程在主線程繼續(xù)之前完成

示例代碼

#include #include #include  void worker_function(int id) {  std::cout << "線程 " << id << " 開始工作\n";  std::this_thread::sleep_for(std::chrono::seconds(2));  std::cout << "線程 " << id << " 完成工作\n"; }  int main() {  std::cout << "主線程開始\n";    std::thread t1(worker_function, 1);  std::thread t2(worker_function, 2);    std::cout << "等待線程完成...\n";    // 使用 join() 等待線程完成  t1.join();  t2.join();    std::cout << "所有線程完成,主線程結(jié)束\n";  return 0; } 

detach()

detach() 方法會將線程從 std::thread 對象中分離,使線程在后臺獨立運行。分離后的線程無法再被 join(),也無法直接控制。

特點

  • 非阻塞性:調(diào)用 detach() 后立即返回,不會阻塞當(dāng)前線程
  • 脫離控制:分離的線程無法被主線程控制,主線程無法等待其完成
  • 資源管理復(fù)雜:需要確保分離的線程訪問的資源在線程結(jié)束前保持有效

這里的主線程不一定是絕對意義上的進程的主線程,也可以是創(chuàng)建子線程的那個線程,也可以是其它能拿到thread對象的線程。

示例代碼

#include #include #include  void background_task(int id) {  std::cout << "后臺線程 " << id << " 開始工作\n";  std::this_thread::sleep_for(std::chrono::seconds(3));  std::cout << "后臺線程 " << id << " 完成工作\n"; }  int main() {  std::cout << "主線程開始\n";    std::thread t1(background_task, 1);    // 使用 detach() 分離線程  t1.detach();    std::cout << "線程已分離,主線程繼續(xù)執(zhí)行\(zhòng)n";    // 主線程可能在子線程完成前就結(jié)束  std::this_thread::sleep_for(std::chrono::seconds(1));  std::cout << "主線程結(jié)束\n";    return 0; } 

為什么不推薦使用 detach()

1. 資源生命周期管理困難

當(dāng)使用 detach() 時,分離的線程脫離了主線程的控制,無法保證執(zhí)行順序,這會導(dǎo)致以下問題:

class DataProcessor { private:  std::vectordata;   public:  void process_in_background() {  std::thread t([this]() {  for (int& item : data) {  // 危險!data 可能已被銷毀  item *= 2;  std::this_thread::sleep_for(std::chrono::milliseconds(100));  }  });  t.detach();  // 問題:無法控制線程和對象銷毀的順序  } };  int main() {  {  DataProcessor processor;  processor.process_in_background();  }  // processor 在這里被銷毀,但無法確保分離的線程已完成    return 0; } 

2. 無法控制執(zhí)行順序和完成時機

#include #include #include  void write_log(const std::string& message) {  std::ofstream file("log.txt", std::ios::app);  std::this_thread::sleep_for(std::chrono::seconds(2));  file << message << std::endl; // 無法保證在程序結(jié)束前完成 }  int main() {  std::thread logger(write_log, "重要日志信息");  logger.detach();    // 主線程結(jié)束,無法確保日志寫入完成  return 0; } 

推薦使用 join() 的原因

1. 確保資源完整性

class SafeDataProcessor { private:  std::vectordata;   public:  void process_data() {  std::thread t([this]() {  for (int& item : data) {  item *= 2;  std::this_thread::sleep_for(std::chrono::milliseconds(100));  }  });    t.join();  // 確保線程在對象銷毀前完成  } }; 

2. 異常安全,RAII核心還是確保資源完整性

class ThreadManager { private:  std::vectorthreads;   public:  ~ThreadManager() {  // RAII 模式確保所有線程在析構(gòu)前完成  for (auto& t : threads) {  if (t.joinable()) {  t.join();  }  }  }    void add_task(std::function task) {  threads.emplace_back(task);  } }; 

最佳實踐

1. 使用 RAII 管理線程

class ThreadRAII { private:  std::thread t;   public:  template  ThreadRAII(F&& f, Args&&... args)   : t(std::forward(f), std::forward(args)...) {}    ~ThreadRAII() {  if (t.joinable()) {  t.join();  }  }    // 禁止拷貝  ThreadRAII(const ThreadRAII&) = delete;  ThreadRAII& operator=(const ThreadRAII&) = delete;    // 允許移動  ThreadRAII(ThreadRAII&&) = default;  ThreadRAII& operator=(ThreadRAII&&) = default; }; 

2. 使用線程池代替 detach

這個寫代碼有點麻煩,不列出了。

總結(jié)

  • join() 提供了更好的資源管理和程序控制,確保線程在適當(dāng)?shù)臅r機完成
  • detach() 雖然提供了非阻塞的執(zhí)行方式,但失去了對線程的控制,無法保證執(zhí)行順序和資源安全
  • 在大多數(shù)情況下,推薦使用 join() 或更高級的線程管理機制(如線程池)
  • 如果確實需要后臺線程,考慮使用專門的線程池或異步任務(wù)框架
  • 始終記?。好總€ std::thread 對象在銷毀前必須調(diào)用 join() 或 detach(),否則程序會調(diào)用 std::terminate()


本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉