簡體   English   中英

C ++ 11:std :: thread匯集了嗎?

[英]C++11: std::thread pooled?

在C ++ 03中,我使用pthread和自建的線程池,它總是保持一些線程運行(因為pthread_create很慢),這樣我就可以在不考慮性能問題的情況下為小任務啟動線程。

現在,在C ++ 11中我們有std::thread 我想標准沒有說明具體的實現,所以我的問題是標准的庫實現。 他們通常選擇合並方法,其中構造std::thread是便宜的(例如,不會在posix上調用pthread_create ),還是std::thread只是一個包裝器?

換句話說,是否仍然在C ++ 11中推薦一個線程池,或者我應該只在需要時創建一個std::thread並將性能提升到標准庫?

通常, std::thread應該是底層系統原語的最小包裝器。 例如,如果您使用的是pthread平台,則可以使用以下程序進行測試,無論您創建多少個線程,它們都是使用唯一的pthread_t ID創建的(這意味着它們是在運行時創建的,而不是從線程池):

#include <assert.h>
#include <mutex>
#include <set>
#include <thread>
#include <vector>

#include <pthread.h>

int main() {
  std::vector<std::thread> workers;
  std::set<long long> thread_ids;
  std::mutex m;
  const int n = 1024;

  for (int i = 0; i < n; ++i) {
    workers.push_back(std::thread([&] {
      std::lock_guard<std::mutex> lock(m);
      thread_ids.insert(pthread_self());
    }));
  }
  for (auto& worker : workers) {
    worker.join();
  }
  assert(thread_ids.size() == n);

  return 0;
}

所以線程池仍然很有意義。 也就是說,我看過一個視頻,其中C ++委員會成員討論了關於std::async (IIRC)的線程池,但我現在找不到它。

std::thread是一個執行線程。 期。 它來自哪里,如何到達那里,是否存在一些“實際”線程等等,都與標准無關。 只要它像一個線程,它就可以是一個std::thread

現在,很可能std::thread是一個真實的OS線程,而不是從線程池或其他東西中提取的東西。 但是理論上C ++ 11確實允許將std::thread實現為從池中提取的東西。

std::thread應該在抽象成本方面非常便宜,它是低級別的東西。 據我了解,標准庫實現可能只是盡可能地封裝底層的OS機制,因此您可以假設線程創建的開銷相似或相當。

我不知道任何具體的實現,但這是我從閱讀C ++ Concurrency In Action的第二手理解,標准建議他們使用最有效的方法實用。 作者肯定認為與DIY相比,成本會或多或少地微不足道。

這個庫在概念上與Boost類似,所以我想用Boost實現來得出一些結論不會太牽強。

基本上,我認為沒有直接回答你的問題,因為它沒有明確說明。 雖然聽起來我們會更有可能看到非常薄的包裝器實現,但我不認為庫編寫器如果提供效率優勢就不會使用線程池。

首先,正如您所提到的,C ++標准基本上沒有指定庫實現。 但是C ++標准庫的實現者遵守“as-if”規則。

例如,這意味着std::thread構造函數應該表現得就好像新線程創建了底層API的瘦包裝還是高效的實現(如線程池)。 (這里,'thread'表示C ++ 11規范中的抽​​象執行線程 ,而不是具體的OS本機線程)

關於線程池實現;

  • C ++編譯器和庫應該正確處理C ++線程特定的資源(即thread_local變量),它們應該在運行時協同工作。
  • 即使滿足上述條件,似乎也不可能與OS特定的線程資源(Windows的TLS,pthread的TSS等)協同工作。

所以,我假設大多數std::thread實現只是底層線程API的包裝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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