スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

マルチスレッド

元ネタは掲示板のもの。
忘れないようにここにメモしておく。

複数のスレッドが絶えず同じミューテックスまたはクリティカルセッションで排他制御しているとき、うまく順番に呼ばれるとは限らない。

たとえば

スレッドA()
{
    無限ループ
    {
        ロック
        何か処理
        アンロック
    }
}

スレッドB()
{
    無限ループ
    {
        ロック
        何か処理
        アンロック
    }
}

の場合、スレッドAがアンロックしたらスレッドBが動いて欲しいわけだが、そういう保証はない。
スレッドAがアンロックしたら、またスレッドAがロックしてしまう可能性がある。
実際にどうなるかはロック・アンロックがどう実装されているかによるのでOSなどで結果が異なる。

Windows Vistaだと、片方のスレッドばかり動いてしまうんだってさ。
俺はまだVista持ってない。

今までそんなこと気にしてプログラム書いたことないなあ。
回避するとしたら、アンロックした後すぐにロックを行う可能性のある処理では、アンロックの後Sleep(0)を入れればいいのだろうか?(未確認)
その前にスレッドAばかり動いてしまうOSでなければ、Sleep(0)で解決するか確認できないなあ。

これは、微妙な条件や速さタイミングで変化するマルチスレッドの問題である。
たとえばデバッグしようとしてデバッガ動かすと動作変わる。
こりゃ厄介な現象だね。
  1. 2007/04/26(木) 23:02:15|
  2. Win/C++
  3. | トラックバック:0
  4. | コメント:0
<<高濃度酸素水 | ホーム | デバッグでウイルスバスターが邪魔>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://wclrp.blog90.fc2.com/tb.php/28-bdd9e3ff
この記事にトラックバックする(FC2ブログユーザー)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。