teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

説明追加

2020/03/24 13:28

投稿

guriguri
guriguri

スコア34

title CHANGED
File without changes
body CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
  調査したところ job を実行する側の while (!jobs.empty()) {...} のループから抜ける(実際には while(1) {...} の完了)まで待っているようでした。
32
32
 
33
- unique_lockで取得したロックが解放されていないからだろうと思い、下記のようにunique_lockを中括弧 { } で囲こみ、中括弧から抜ける際に unique_lock のデストラクタが呼ばれてロックが解放されるのを期待実装しました。
33
+ unique_lockで取得したロックが解放されていないからだろうと思い、下記のようにunique_lockを中括弧 { } で囲こみ、中括弧から抜ける際に unique_lock のデストラクタが呼ばれてロックが解放されるのを期待して実装しました。
34
34
  ```c++
35
35
  改修版:キュー内のjobをひらすら実行するロジック (ワーカースレッドにて実行)
36
36
  while(1) {

1

質問内容変更

2020/03/24 13:28

投稿

guriguri
guriguri

スコア34

title CHANGED
File without changes
body CHANGED
@@ -46,13 +46,13 @@
46
46
  }
47
47
  ```
48
48
  結果はビンゴでした。
49
- ここで質問なのですがこれは問題ないのでしょうか?
50
- ネットの情報やサンプルをいろいろ探してもこのようにしているものが見つからなかったの心配でして。
51
- あと、condition_variableのwait関数はスレッドが待ちに入った瞬間にそのスレッドが保持しているlockを開放すると思ったのですがそのような機能はないのでしょうか? (javaと混乱しているような気もしないでもないのですが...)
52
49
 
53
- 纏めますと質問は2つあり、
54
- 1つ目は、unique_lock<mutex> mlock(mtx); を中括弧 { } で囲とにり抜けた際(デストラ呼ばれ)lockが解放されるようにしているのは問題ないか.
50
+ ここで質問なのですがこの中括弧にてロックが解放されるようにして問題ないのでしょう
55
- 2つ目は、condition_variableのwait関数にはスレッドが保持しているlockを開放する機能はない
51
+ わざわざワーカースレッドを利用しているjobの処理を待ちたくないから利用しているのにjobを追加する際に待っていては本末転倒でして・・・。
56
- となります。
57
52
 
53
+ 今書いていて思ったのですが job キューの更新中に job が追加されることがあるので危険かもしれないですね・・・。
54
+ んー、解決策が分からないです。
55
+
56
+ よくあるケースだと思うのですがネットでは一歩踏み込んだ良い例が見つからずでして。
57
+
58
58
  以上、どうぞよろしくお願いいたします。