近頃の同期API

2017/12/11

Windows NT以降、ちゃんとしたマルチスレッドプログラムができるようになり、複数のスレッドが同時にデータにアクセスできてしまうケースが発生するようになりました。これを防ぐには同期APIを使って対処する必要があります。Win32関係のAPIを見ると、どの本でもこれらは載っているでしょう。

  • Mutex(ミューテックス)
  • Semaphore(セマフォ)
  • Event(イベント)
  • Critical Section(クリティカルセクション)

クリティカルセクション以外は複数プロセス間の同期にも使えます。ところがいつの間にか同期APIが増えています。msdn blogを読んでいて(紹介もとページは失念)。これはびっくり。

Condition Variables

Vista以降で使用可能。FIFOを実装するときに使えそう。サンプルページ

Timer Queues

Windows 2000以降で使用可能。キュー付のタイマ。サンプルページ

Waitable Timer

Vista以降で使用可能Windows 98以降で使用可能(ご指摘感謝)。名前付きオブジェクトが指定できるので、Terminal Serviceで使うときはGlobal,LocalのPrefixが必要。名前付オブジェクトが指定できると言うことは、複数のプロセスにおいてハンドルが複製できると言うことでもある。10秒後に〜の処理をするような場合使える。まぁ、通常はSleep使っちゃえばいいでしょう。
本領を発揮するのは非同期処理するときだそうな。サンプルページ
Vista以降で使用可能なのはCreateWaitableTimerEx()でした。

Sigly Link List

Windows XP以降で使用可能。プロセス内の複数スレッドの同期書き込みを保証するもの…でいいかな。サンプルページ

新しいAPI使ってますか?

同期処理は非常にやっかいで、誰もがはまり、なおかつデバッグしにくい処理でもあります。API提供してくれるのはうれしいですね。といっても、受注プログラムでプラットフォーム決まっている一品ものならまだしも、かなーり古いプラットフォームまでサポートしなければならないパッケージソフトだとなかなか新しいAPI使うのは厳しいです。
これがWindows Presentation Foundationのように「XP/Vista以降だとこーんな見栄えができるんですよ」とか言えるのならまだしも、「内部処理が楽になるので…」と言ってもなかなか難しそう。