2017-03-01 11 views
-2

私は時にはマルチスレッドを実行する必要があるいくつかのライブラリコードがありますが、より一般的にはシングルスレッドです。非常に頻繁に呼び出される一連の小さなルーチンです。以前の経験とプロファイリングでは、追加の遅延がパフォーマンスに悪影響を与える可能性があることを示しているため、不要なオーバーヘッドを避けたいと考えています。C++ 03 NULLポインタ対ヌルオブジェクトパターン:パフォーマンスへの影響

私は、シングルスレッドとマルチスレッドの使用のためにライブラリの別のインスタンスを提供することはできませんし、シングルスレッドのスレッドセーフなラッパーも提供できません。これらの制限は両方ともライブラリの設計によるものです。

マルチスレッドで実行するときのルーチンを保護する方法として、スコープ付きのミューテックスを使用する方法があります。私の最初の考えはthis SO answerの線に沿っていた。

しかし、ほとんどの場合、ルーチンはシングルスレッドで実行されています。ヌルポインタチェックのオーバーヘッドは気にしません。これは非常に遅いARM9プロセッサ上で実行され、サイクルごとにカウントされます。

実際には、nullポインタのチェックとプロファイルを使用して、そのコストを確認していますが、もっと良い方法があるかどうかは疑問です。たとえば、ヌルオブジェクトパターン、またはライブラリがコールバックを呼び出すなどです。

答えて

3

本当に最高の答えを出すためにここに欠けている情報があるように感じますが、ここでポインタを使用する理由は実際にはありません。おそらく、あなたはいくつかのライブラリコードを呼び出すでしょう、それはvoid foo(int)と呼ばれる関数だとしましょう。このコードは変更できません。スレッドセーフではありません。しかし、コードを変更することはできますか?代わりにfooの周りにラッパーを呼び出して、あなたのコードを呼び出す:型はコンパイラに知られているので、第二の

struct NoMutex { 
    void lock() {} 
    bool try_lock() { return true; } 
    void unlock() {} 
}; 

std::mutex m1; 
NoMutex m2; 
foo_wrapper(m1, 0); // thread safe 
foo_wrapper(m2, 0); // thread unsafe 

template <class M> 
void foo_wrapper(M& mutex, int x); { std::lock_guard(mutex); foo(x); } 

さて、あなたは単に些細なノーオペレーションミューテックスを書くことができますfoo_wrapperへの呼び出しにはオーバーヘッドはありません。

関連する問題