同期オブジェクトとLockfree

公開:2011-08-31 21:17
更新:2020-02-15 04:36
カテゴリ:c++,dawもどきの作成,windows,audio

オーバーラップI/Oを追っかけていたら何故か同期オブジェクト~lockfreeに行き着いてしまった。

マルチスレッド処理において同期オブジェクトというのは必要悪であり、パフォーマンスを阻害する要因である。これを解決する(要件によるのだろうけれど)のがLockfreeアルゴリズムである。Boost.Lockfreeはそれを狙ったコンテナライブラリものらしい。

同期オブジェクトというのは容易に使うものではなく、慎重に検討の上必要最低限に使用するものなのであろう。私はミューテックスをよく使うが思慮深くはないのでかなりいいかげんなコードである。パフォーマンスも悪いのではないか。測ったこともないが。

LockFreeな世界を目指そうとすると、よくわからない世界(アセンブリ言語)の足を踏み入れなくてはいけない。例えばコンパイラの最適化などに気を配るとか、メモリバリアを意識するとかなんとか、CASとかなんとか。すんません。まだよくわかってません、私。

C++11になると、なんとatomicな処理をライブラリがサポートしてくれる。Boost.LockfreeもC++11をライブラリをベースに作られているとか。C++98上でもサポートするようにBoost.Atomicをベースに作られているとも書いてあった。このBoost.Atomicとかいうのもひょっとしてかなり「ナニな」(かなり難解な)もののような臭いを放っている。

スレッド間で共有するバッファの競合などを防止するために同期オブジェクトをよく使用する。書き込みスレッドと読み込みスレッドとかの競合防止。書いているときに読み込まれるとおかしくなるので。けれど、効率的でないなあとか思う。ダブルバッファやキューやリングバッファにすればいいのではないかと思うが、コンテナ自体がマルチスレッドに対応していないので使用するのはどきどきする。んで同期オブジェクトを使うことによって心の平安を得るのだが、今度はパフォーマンスが気になってくる。堂々巡りな状態となり、次第にヤル気を奪ってゆく。Lockfreeが私にとって救世主となるのかどうか。