2011-01-29 9 views
0

AとBの2つのスレッドがあるとします。Thread BThread Aから作成して関数にアクセスします。関数スレッドを安全にするかどうか

Thread Aはほとんどの時間の関数を使用し、Thread Bは特定のコマンドでそれをほとんど使用しません。

私が関数をクリティカルセクションの周りに置くことによってスレッドセーフであれば、Thread Bが存在しない場合でも、毎回Thread Aの処理速度が遅くなりませんか?または、私はThread Bの作業をThread A自体ではなく作成する必要がありますか?

+5

スレッドセーフはリソース用であり、関数用ではありません...共有リソースがない場合は、まったく気にする必要はありません。 –

+0

種類は、関数内のグローバル状態を変更するかどうかによって異なります。そうであれば、Bが「まれに」呼び出す場合でも、クリティカルセクションを使用することで、おそらく多くの時間と悪化を避けることになります。 –

+0

'スレッドA 'が関数にアクセスしているときに'スレッドB'が作成されている場合。 'スレッドA'が関数を出るのを待つのだろうか?この機能は共有リソース、すなわち編集制御を有する。 – user963241

答えて

1

クリティカルセクションの実際のパフォーマンスへの影響は、自分で測定する必要があります。クリティカルセクションが入力された回数に関連してコードに多くの作業があると、あまりにも傷つくことはないでしょう。クリティカルセクションでほとんど仕事をしていない場合(たとえば、数字を増やすなど)、パフォーマンスが低下する可能性があります。クリティカルセクションでマルチスレッドのアプローチを試し、何が起こるのかを見てみることをお勧めします。パフォーマンスが十分あれば、心配する必要はありません。終了するのが遅すぎる場合は、スレッドAに処理をさせたい理由をバックアップする番号がいくつかあります。

3

PROFILE FIRST。ミューテックスの重さが重大にならないというのは良いことです。毎秒何百万回もロックしてロックを解除できます。コードは正しく - どのロックメカニズムを使用してもターゲットシステムのバグや障害が発生しにくく、のみ、の場合は、パフォーマンスを向上させる必要がある場合は代替戦略を検討してください。

リソース(つまり関数)の競合が非常に少ないと予想される場合は、フル・オンのミューテックス・タイプが無駄かもしれません。また、リソースの特定の使用パターンに応じて、スピン・ロックが実行可能です。

関連する問題