の
activate( ):
const char wakeMessage(WAKE_MESSAGE);
write(mWritePipeFd, &wakeMessage, 1);
pollEvents( ):
if (mPollFds[wake].revents & POLLIN) {
read(mPollFds[wake].fd, &msg, 1);
}
についてなのですが、
なぜpipeをつかってメッセージのWrite/Read
をおこなう必要があるのでしょうか?
このメッセージのやりとりによっていったい何が行われるのでしょうか?
ご教示のほどよろしくお願いします。
以上
On 12月7日, 午前3:23, 蔵花たけし <kuraba...@gmail.com> wrote:
> なぜpipeをつかってメッセージのWrite/Read
> をおこなう必要があるのでしょうか?
蔵花たけしさんだったらpipeを使わずにどのように実装しますか?
それとpipeを使った場合の比較をすることで理解が深まると思います。
> このメッセージのやりとりによっていったい何が行われるのでしょうか?
蔵花たけしさんなりの仮説を書いてみてください。そうすればそれを検証するためのアイディアがもらえるかもしれません。
なお、上手な質問をするために以下のページが参考になります。
技術系メーリングリストで質問するときのパターン・ランゲージ
「問題の解決」から「情報の共有」に至るために
http://www.hyuki.com/writing/techask.html
私はこのwrite/readは必要ないと考えています。
よって、pipe()など使用する必要性はまったくありません。
poll(mPollFds, numFds, nbEvents ? 0 : -1);
で監視するのは、センサー用に用意したファイルディスクリプタだけ
監視すればよいと考えています。
ただ、これらのファイルディスクリプタにデータが来なかった場合、
poll()は待機状態になってしまう危険性があります。
そこで、poll()の第3引数は、-1(timeout に負の値を指定すると、タイムアウト時間が無限)ではなく、
0以上のタイムアウト時間を設定すればよいのではないかとおもうのですが。
なぜこんな危険な仕様にしたのか検討もつきません。
activate( ) とpollEvents( ) は別々のスレッドで呼ばれるのではないかな。
そうすれば、poll()でタイムアウトを無限にしていても問題がない。
排他制御を考慮したスレッド間のデータのやりとりのためにpipeを使っているのだと思います。
static const char WAKE_MESSAGE = 'W';
const char wakeMessage(WAKE_MESSAGE);
int result = write(mWritePipeFd, &wakeMessage, 1);
"W"というメッセージをおくっているだけで、それ以外の
データをおくっていません。
それだけのためにpipeをつかっているのでしょうか?
これが排他制御に関連しているとは思えません。
私は、「これらのファイルディスクリプタにデータが来なかった場合、
poll()は待機状態になってしまう危険性があります」
と書きましたが、この危険を回避するために存在するのでは
ないでしょうか?
すなわち、activate()をcallすることで、確実にファイルディスクリプタには
書き込みが行われ,pollEvents()にて読み込みが行われ、
無限に待機するという状態を回避することができます。
On 12月7日, 午後10:20, koba <tetsu.k...@gmail.com> wrote:
> kobaです。
>
> activate( ) とpollEvents( ) は別々のスレッドで呼ばれるのではないかな。
> そうすれば、poll()でタイムアウトを無限にしていても問題がない。
>
この「sensor以外のファイルディスクリプタ」を用意しないといけないわけですが、
なぜ、外部にファイルディスクリプタを用意するのではなく、内部のファイルディスクリプタ
(pipe()用)を用意したのでしょうか?
ロックを開放するときだけ、一時的にファイルディスクリプタを用意したい。
そこで、ファイルを利用せず、メモリー上のバッファを利用すればよいのでは
とおもったのでは?それにはpipe()用のファイルディスクリプタが一番よいと。