簡體   English   中英

C ++ constexpr thread_local ID

[英]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.

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