2017-09-29 12 views
0

各スレッドのconstexpr thread_local変数に異なる値を取得する方法はありますか?C++ constexpr thread_local id

constexpr thread_local someType someVar = ......; 

これはconstexpr thread_localがサポートされているようですが、thread_localインジケータはこの場合何もしないようです。

+6

いくつかの矛盾する要件があるようです。 'constexpr'はコンパイル時の定数であり、スレッドは純粋な実行時の概念です。あなたは何をしようとしていますか?解決したい*実際の問題は何ですか? [XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)について読んで、この質問との関係を考えてください。 –

+0

これで何を達成しようとしていますか? – NathanOliver

+0

コンパイル時に右のスレッドから何かが呼び出されるかどうかチェックしたい –

答えて

0

あなたの質問について考えてみると、なぜこれが不可能であるかが分かります。

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; 
} 

この例では、エラー処理に欠け、生産グレードのコードではありませんのでご注意ください:ちょうどあなたが保護しようとしている。この方法は、例えば、スレッドオブジェクトそのものである「見る」ということだけオブジェクトがあることを確認してください!それを使用する場合は、必ずそれを洗練してください。

関連する問題