質問内容
2つの異なるスレッドから下記コードの client_work(), get_client() をそれぞれ呼び出します.
排他処理を行い busy状態をチェックしているのでそれぞれのスレッドが同じタイミングにclientを扱うことはない
と考えたのですがどうも同じタイミングでclientを扱うことがあるようです。
mutexの扱いを間違っている箇所等ありますでしょうか?
c++
1mutex mtx; 2 3// 1秒毎にclientのbusy状態をチェックしbusyでなければ、busyにしてからdo()を呼び出す. 4void client_work() { 5 thread th([] { 6 unique_lock<mutex> lock(mtx, defer_lock); // 遅延ロック 7 while (1) { 8 mtx.lock(); 9 if (!client->busy) { 10 client->busy = true; 11 mtx.unlock(); 12 client->do(); // 重い処理を行う 13 client->busy = false; 14 } else { 15 mtx.unlock(); 16 } 17 sleep(1); 18 } 19 } 20 th.detach(); // アプリが終わるまでずっと処理継続 21} 22 23// clientがbusyでなくなった時点でclientを返す. (呼び出し側はclientの処理が終わった時点で client->busy = false にする) 24Client *get_client() { 25 while(1) { 26 lock_guard<mutex> lock(mtx); 27 if(!client->busy) { 28 client->busy = true; 29 return client; 30 } 31 } 32} 33
本来、上のようなケースでは condition_variable などが有効だとは思うのですが
このコードは実際に利用しているコードを極力シンプルにしたものでしてwhileにより都度 busy状態の確認が必須となります。
どうぞ宜しくお願いいたします。
回答1件
あなたの回答
tips
プレビュー