[英]C++ constexpr thread_local id
有沒有辦法在每個線程的constexpr thread_local變量中獲得不同的值?
constexpr thread_local someType someVar = ......;
似乎constexpr thread_local受支持,但在這種情況下thread_local指示符似乎沒有任何作用。
如果您考慮自己的問題,您自己會明白為什么這不可能。
什么是constexpr
?
根據非正式標准網站cppreference :
constexpr說明符聲明可以在編譯時評估函數或變量的值。
編譯器必須在編譯時解析該值,並且該值在整個程序執行期間不應更改。
線程本地存儲
相反,線程是運行時概念。 C ++ 11在語言中引入了線程概念,因此您可以說編譯器可以“意識到”線程概念。 但是,編譯器無法始終預測是否要執行線程(也許您僅在特定配置下運行該線程),或者將要產生多少個實例,等等。
可能的實施
為何不嘗試使用技巧和技巧來強制對單個線程的特定模塊/方法的訪問,為什么不使用該語言的非常原始的功能?
您也可以使用簡單的封裝來實現它。 只需確保您嘗試保護的唯一“看到”此方法的對象是線程對象本身,例如:
#include <iostream>
#include <thread>
#include <chrono>
using namespace std;
class SpecialWorker
{
public:
void start()
{
m_thread = std::move(std::thread(&SpecialWorker::run, this));
}
void join()
{
m_thread.join();
}
protected:
virtual void run() { protectedTask(); }
private:
void protectedTask()
{
cout << "PROTECT ME!" << endl;
}
std::thread m_thread;
};
int main(int argc, char ** argv)
{
SpecialWorker a;
a.start();
a.join();
return 0;
}
請注意,此示例缺少錯誤處理,並且不是生產級代碼! 如果要使用它,請確保對其進行優化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.