2

次のコードがあります(簡単にするために一部を省略しました)

ヘッダ:

class DbgModuleMarker
{
public:
    DbgModuleMarker( std::string name );

    static std::ostream createStream( const DbgModuleMarker& marker );

    std::ostream& operator()() const;

};

extern DbgModuleMarker PHYSICS;

ソース:

std::ostream& DbgModuleMarker::operator()() const
{
    static std::ostream os = createStream( *this );
    return os;
}

このコードの目的は、operator()次のように使用できるようにすることです

debug_modules::PHYSICS() << "Foo" << endl;

この方法で関数が呼び出されたときに static がどのように動作するかは本当にわかりません。

私は関数が一度だけ呼び出されることを期待しますcreateStream(または呼び出されない場合operator()は呼び出されません

私が期待している動作が起こるかどうか、これが考えられるアイデアなのか、それとも気づかずに非常に間違ったことをしているのかを知りたいです。

スレッドの安全性と例外の安全性にはどのような影響がありますか?

( std::ostream のスレッドセーフはここでは問題にならないため、作成されたストリーム自体がスレッドセーフになると考えてください)

4

1 に答える 1

1

標準に従って、関数スコープ内で定義された静的メンバーの初期化は 1 回だけ行われます。

    static std::ostream os = createStream( *this ); // initialized only once

また、C++11 を使用している場合はスレッドセーフです。

Pls はこれらの議論を見てください:

1) C++11 でのローカル静的初期化のスレッド セーフ

2)静的変数の初期化

C++11 を使用していない場合、operator() はスレッドセーフではありません

 static std::ostream os = createStream( *this ); // if not C++11, this is not thread-safe and must be guarded.
于 2013-04-10T03:15:01.553 に答える