Pthread_mutex_lock/unlockの処理コスト

pthread_mutex_lock/unlockの処理コスト

スレッドプログラミングをするにあたって適切なセマフォの操作は必須の課題です。よく問題になるのは双方でロックをかけようとしてロック待ちの状態が発生することで遅延が発生し、全体の処理が遅くなってしまうというケースです。ですが一方で、2つスレッドがあった時に一方のスレッドは頻繁に資源を触るけど、他方のスレッドはほとんど資源を触らないという状況もあります。この場合、資源のつかみ合いはほとんど発生しないと考えられますが、そうなると「そもそもロックをかけること自体にどれくらいコストがあるのか?」ということが気になります。とくに秒間数百万回の処理で毎回そんなことやっていいのか、というのが気になります。ということで、ちょっと調べてみました。

今回対象としたのはpthread (Posix thread) です。pthread_mutex_lockとunlockを特にオプションなど指定せず、素直に使ってみました。単純な足し算を228回繰り返すさい、mutex_lock無しで実行した場合(普通のシングルスレッドで書かれたプログラム)と、mutex_lock, unlockを毎回の計算の前後で実行した場合の比較をしました。時刻はgettimeofdayで見ているやら、試行回数は2,3回やらなので、その程度の精度だと思ってください。

計測に使ったコードはgithubにおいてあります。実験は以下の環境でそれぞれやってみました。

  • OSX 10.8.5 1.6GHz Core i5
  • OSX 10.8.5 2.53GHz Core 2 Duo
  • Linux 3.8.0-31 Pentium G640 2.80GHz
  • Linux 3.2.0-39 Xeon® E5645 2.4GHz (@Sakura VPS)

で、結果は以下のとおり。

詳細な数値は省きますが、(lock/unlock有り時間 - lock/unlock無し時間) / 繰り返し回数 という計算をしてみると、 Core i5のOSXで約51ナノ秒、Pentium G640のLinuxで約25ナノ秒が、lockとunlockの処理に平均して必要ということがおおよそ推測されます。一回一回は非常に短い処理時間ですが、一秒に数百万回呼び出すようなときはちょっと考えたほうがいいかもしれません。

Comments