[英]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本機線程)
關於線程池實現;
thread_local
變量),它們應該在運行時協同工作。 所以,我假設大多數std::thread
實現只是底層線程API的包裝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.