ページ 11

boostリファレンスの英文訳(?)の問題です

Posted: 2013年4月21日(日) 18:21
by SUE
久しぶりにお世話になります。

僕は今boost::lockfre::queueを使おうと思っています。そのメンバのempty()についてなのですが、
公式リファレンスには、
"The result is only accurate, if no other thread modifies the queue. Therefore it is rarely practical to use this value in program logic. "
とのメモがありました。これを
「他のどのスレッドもキューに変更を加えていなければ、返り値は正確である。それゆえに、この値をプログラムの論理で使うことはほとんど実用的ではない。」
と訳したのですが、これだとキューが空かどうかを調べる方法がありません(size()も存在しません)。pop()は空かどうかを返しますがpop()してしまうので…

 この訳が誤訳なのでしょうか、それともそのような仕様なのでしょうか。ご教示お願いします。

Re: boostリファレンスの英文訳(?)の問題です

Posted: 2013年4月21日(日) 18:48
by h2so5

Re: boostリファレンスの英文訳(?)の問題です

Posted: 2013年4月21日(日) 19:00
by ISLe
仕様に照らすと
「返り値が唯一正確であるのは、他のどのスレッドもキューに変更を加えていない場合である。ゆえに、この値をプログラムのロジックに使うことはあまり現実的ではない。」
ということですかね。
要するに「この値はほとんど役に立たないよ」ということですよね。

Re: boostリファレンスの英文訳(?)の問題です

Posted: 2013年4月21日(日) 23:57
by SUE
お二人ともありがとうございました。

これは結局mutexなりを使う部分が出てきそうですね・・・。一応lockfree queueのメリットは残るので使い続けますが。

Re: boostリファレンスの英文訳(?)の問題です

Posted: 2013年4月22日(月) 07:30
by beatle
わざわざロックフリーなキューを使うのに、mutexも併用するんですか?
なんだか可笑しな話ですね。

ロックフリーキューの使い方として、消費する側は
「popしてみて成功したら仕事をするし、失敗したら再度popに挑戦する」
みたいな動きをするのが良いのだと思いますが、SUEさんのプログラムではそういう設計にはなってませんか?

マルチスレッドにおいて、「現時点でキューは空か」と質問するのは、実はあまり意味が無いことです。
「現時点」というのはキューの要素数を表す変数から値を読み込む機械語の実行時点ですが、
もしかしたらその機械語を実行した直後に、他スレッドがキューに値を追加するかもしれないのです。

だから、「キューが空ではないなら、キューから値を取り出して何かする」というのは、
キューが空かを確認する時点と、キューから値を取り出す間に時間差があります。
だから、ロックフリーキューのpopは、「取り出してみて、空だったらfalseを返す」仕様なわけです。

Re: boostリファレンスの英文訳(?)の問題です

Posted: 2013年4月23日(火) 02:15
by SUE
beatleさんありがとうございます。

実はまったく仰る通りで・・・上の返信をした後いろいろ試行錯誤してみたのですが、mutexとロックフリーキューを併用すると
考えると、どうしてもおかしな点があり行き詰まっていました。なるほど、理屈で言うとそういうことだったのですね。

中途半端は諦めて、mutexを使った実装に戻して出直して来たいと思います。上では解決チェックを入れ忘れていましたが、今度は付けます。ありがとうございました。