ドナドナされるプログラマのメモ

Windows用アプリのプログラミングメモ

CEventとCMultiLock::IsLocked

CEventとCMultiLock::IsLocked()の組み合わせでちょっと悩んだのでメモ。

CSemaphoreオブジェクトAのLock待ち中にAbortできるよう、以下のように組んだ。

悩んだのは、IsLocked()。Microsoftのドキュメントでは"Nonzero if the specified object is locked; otherwise 0." (ロックされている場合は非ゼロ, それ以外はゼロ)を返すと書かれている。ところで、CSignalの場合、SetとResetのどちらがロック状態なのだろう?

Reset状態ではLock()を通過できないのでResetがロック状態だと思ったのだが、テストしてみたらSetがロック状態だった。そのため、AbortがSetされたかどうかを確認するのは、if(IsLocked(0) != FALSE){Abort処理} が正解ぽい。

Aborting by using CEvent and CMultiLock