ページ 11

C++11でのmutexについて

Posted: 2014年10月27日(月) 18:40
by tarako
こんにちは, C++11でのmutexについて質問があります.
今自分は, シミュレーションプログラムを書いています.
簡略化すると以下のようなプログラムです.

関数A

コード:

int main () {
 thread t1(loop);
 t1.detach();
 while(1) {
// mtx.lock();
 描画処理のための現在位置計算など;
// mtx.unlock();
 描画処理;
  }
}
関数B

コード:

void loop() {
 while(1) {
  制御処理のための現在位置計算など;
  制御処理;
 }
}
ここで, 関数A, Bの現在位置計算で共通資源にアクセスしています.(重心や位置の物理演算の更新)
そのため, このままでは時々不正な値が出たので, コメント文にあるようにmutexのlockとunlockによって排他制御を試みました.
しかし, 思ったように排他制御が出来なくて困っています.
t1.detach()しているためだと思うのですが, 無限ループを回しながらもう一方のスレッドで擬似的に無限ループを回す方法が
detachを使う以外に思いつかず, ご助言をいただきたいです.
宜しくお願い致します.

理想としては, loop()内の関数が, 共有資源にアクセスする時だけ(位置情報取得の関数などにアクセスする時だけ)ロックをかけ,
安全にアクセスできるようにしたいです.

Re: C++11でのmutexについて

Posted: 2014年10月27日(月) 21:12
by h2so5
tarako さんが書きました: しかし, 思ったように排他制御が出来なくて困っています.
具体的に、どのようにうまく出来ないのかが分かりません。

Re: C++11でのmutexについて

Posted: 2014年10月27日(月) 21:51
by tarako
h2so5 さんが書きました:
tarako さんが書きました: しかし, 思ったように排他制御が出来なくて困っています.
具体的に、どのようにうまく出来ないのかが分かりません。
すいません, 自分としては共有資源をlockしたはずなのに,
関数Bからアクセスされてか, 不正な値が出てしまうという意味です.

Re: C++11でのmutexについて

Posted: 2014年10月27日(月) 22:02
by h2so5
そもそもMutexのLockというのは、
・Lock → リソースが「使用中」かどうかチェックして「使用中」なら解除するまで待って、そうでなければ直ちに「使用中」にする
・Unlock → 「使用中」状態を解除する
この2つを組み合わせることで排他制御をしているわけです。

関数AはLockを使用しているので「使用中」かどうかチェックしてから処理を実行していますが、関数Bは「使用中」かどうかお構いなしに処理をしているということは分かりますか?

Re: C++11でのmutexについて

Posted: 2014年10月27日(月) 22:50
by tarako
[quote="h2so5" id=3,15888,126185]そもそもMutexのLockというのは、
・Lock → リソースが「使用中」かどうかチェックして「使用中」なら解除するまで待って、そうでなければ直ちに「使用中」にする
・Unlock → 「使用中」状態を解除する
この2つを組み合わせることで排他制御をしているわけです。

関数AはLockを使用しているので「使用中」かどうかチェックしてから処理を実行していますが、関数Bは「使用中」かどうかお構いなしに処理をしているということは分かりますか?[/quot]

上の2つの仕組みはわかっていたつもりでしたが, 自分の中で
・Lock → リソースが「使用中」かどうかチェックして「使用中」なら他のすべてのスレッドは解除するまで待って, そうでなければ直ちに「使用中」にする
・Unlock → 「使用中」状態を解除する
というように勘違いをしていました...

この私の勘違いのような動作を実装する場合, LockやUnlockだと難しいのでしょうか?

Re: C++11でのmutexについて

Posted: 2014年10月27日(月) 23:25
by h2so5
一般的にはこう使いますが。

関数A

コード:

int main () {
  thread t1(loop);
  t1.detach();
  while(1) {
    mtx.lock();
    描画処理のための現在位置計算など;
    mtx.unlock();
    描画処理;
  }
}
関数B

コード:

void loop() {
  while(1) {
    mtx.lock();
    制御処理のための現在位置計算など;
    mtx.unlock();
    制御処理;
  }
}

Re: C++11でのmutexについて

Posted: 2014年10月30日(木) 21:49
by tarako
h2so5 さんが書きました:一般的にはこう使いますが。

関数A

コード:

int main () {
  thread t1(loop);
  t1.detach();
  while(1) {
    mtx.lock();
    描画処理のための現在位置計算など;
    mtx.unlock();
    描画処理;
  }
}
関数B

コード:

void loop() {
  while(1) {
    mtx.lock();
    制御処理のための現在位置計算など;
    mtx.unlock();
    制御処理;
  }
}
ご指摘の通り書き換えましたところ, 希望の動作になりました.
本当に助かりました. ありがとうございましたm(_ _)m