Windows NT以降、ちゃんとしたマルチスレッドプログラムができるようになり、複数のスレッドが同時にデータにアクセスできてしまうケースが発生するようになりました。これを防ぐには同期APIを使って対処する必要があります。Win32関係のAPIを見ると、どの本でもこれらは載っているでしょう。
- Mutex(ミューテックス)
- Semaphore(セマフォ)
- Event(イベント)
- Critical Section(クリティカルセクション)
クリティカルセクション以外は複数プロセス間の同期にも使えます。ところがいつの間にか同期APIが増えています。msdn blogを読んでいて(紹介もとページは失念)。これはびっくり。
Condition Variables
Vista以降で使用可能。FIFOを実装するときに使えそう。サンプルページTimer Queues
Windows 2000以降で使用可能。キュー付のタイマ。サンプルページWaitable Timer
本領を発揮するのは非同期処理するときだそうな。サンプルページ
Vista以降で使用可能なのはCreateWaitableTimerEx()でした。
Sigly Link List
Windows XP以降で使用可能。プロセス内の複数スレッドの同期書き込みを保証するもの…でいいかな。サンプルページ新しいAPI使ってますか?
同期処理は非常にやっかいで、誰もがはまり、なおかつデバッグしにくい処理でもあります。API提供してくれるのはうれしいですね。といっても、受注プログラムでプラットフォーム決まっている一品ものならまだしも、かなーり古いプラットフォームまでサポートしなければならないパッケージソフトだとなかなか新しいAPI使うのは厳しいです。これがWindows Presentation Foundationのように「XP/Vista以降だとこーんな見栄えができるんですよ」とか言えるのならまだしも、「内部処理が楽になるので…」と言ってもなかなか難しそう。