[英]Is eager thread_local initialization possible in C++?
[basic.stc.thread]聲明“具有線程存儲持續時間的變量應在其第一次使用odr之前初始化(6.2),如果構造,則應在線程退出時銷毀。”
這是否排除了在創建線程時急切地初始化命名空間范圍的thread_local
變量的實現,並且是否有任何主要的編譯器支持通過某些注釋強制執行此操作的任何機制?
我有一個非常少的性能關鍵的__thread
變量我想要保持不受thread_local
通常會發生的每次訪問的延遲初始化檢查,但我目前需要通過單獨的調用進行設置/拆卸以保持在__thread
限制內關於非平凡的析構函數等。我可以獲得thread_local
,保證每個線程都需要構建/銷毀,並且不進行延遲初始化測試嗎?
如果做不到這一點,處理__thread
設置/拆除呼叫注冊的最清晰的已知模式是什么?
我可以為每個線程獲得有保證的急切構造/銷毀的
thread_local
並且沒有懶惰的初始化測試嗎?
不太可能。
如果做不到這一點,處理
__thread
設置/拆除呼叫注冊的最清晰的已知模式是什么?
您可以將所有特定於線程的信息打包到一個通過一個特定於線程的指針訪問的對象中,該指針在線程啟動時初始化。 例如:
struct ThreadContext {
thread_local static ThreadContext* instance;
ThreadContext() {
assert(!instance);
instance = this;
}
~ThreadContext() {
instance = 0;
}
ThreadContext(ThreadContext const&) = delete;
ThreadContext& operator=(ThreadContext const&) = delete;
};
thread_local ThreadContext* ThreadContext::instance = 0;
void thread_function() {
ThreadContext context;
// Access it elsewhere as:
ThreadContext::instance;
}
ThreadContext* getThisThreadContext() {
return ThreadContext::instance;
// No init check here. Just one move:
// mov rax, QWORD PTR fs:ThreadContext::instance@tpoff
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.