C++11でのmutexについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tarako

C++11でのmutexについて

#1

投稿記事 by tarako » 9年前

こんにちは, 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()内の関数が, 共有資源にアクセスする時だけ(位置情報取得の関数などにアクセスする時だけ)ロックをかけ,
安全にアクセスできるようにしたいです.

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

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

#2

投稿記事 by h2so5 » 9年前

tarako さんが書きました: しかし, 思ったように排他制御が出来なくて困っています.
具体的に、どのようにうまく出来ないのかが分かりません。

tarako

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

#3

投稿記事 by tarako » 9年前

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

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

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

#4

投稿記事 by h2so5 » 9年前

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

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

tarako

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

#5

投稿記事 by tarako » 9年前

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

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

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

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

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

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

#6

投稿記事 by h2so5 » 9年前

一般的にはこう使いますが。

関数A

コード:

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

コード:

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

tarako

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

#7

投稿記事 by tarako » 9年前

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

閉鎖

“C言語何でも質問掲示板” へ戻る