2017/06/20

[linux]スレッド間のやりとりをバッファ経由に変更

なんだか、何のために記事を書いているのかわからなくなってきた・・・。

やりたいのは複数プロセス間のソケット通信。
プロセス間は1本のソケットでつないでいる。
直接通信できるのは接続した相手だけだが、転送してもらうことができる。


起きているのは、双方から同時に転送が行われると、どこかで止まるという現象。
排他をかけたり、状態を持って止めたり、あれこれ悩んでいる。
おかげで、元のソースに戻れないくらいだ。。。


前回考えた最後の図を載せよう。

image5

書いてある内容は無視して、線だけ見ていく。
A-B間、B-C間はソケット通信だ。
では、Bの中の点線は何かというと、スレッド間のやりとりになる。

スレッド間といっても、相手にソケットを送信したいだけなので、データパケットを作って相手のsocket descriptorを使って送信していた。
が、これはなんとなくよろしくない感触がある。
いくらsdがわかって送信できたとしても、やはり相手の通信路は相手のスレッドに処理してもらうのが筋なんじゃなかろうか。


しかし、スレッド間通信ってどうやるものなのだろう?
今回はソケット受信をpoll()しているスレッドがあったので、そこでタイムアウトするようにし、他スレッド処理要求ありフラグがあったらその処理をする、ということにした。
以前は関数呼び出しだったのでメモリを直接見せていたが、今回は時差が発生するので別にメモリを確保するようにした。

あー、キュー方式にして、キューに入っていたら処理をする、というやり方の方が良いな。。。
他スレッドからの要求なんていくつやってくるか決められないし、数を決めたとしてもあふれるようなら待たせないといかん。


まだフラグを立てるやり方だが、この方式に変更したところ、急に安定しだした。
困ったことに、動かないときは動かない場所を見ればよかったのだが、動き出したように見えると流れが期待通りかどうか確認するのが難しい。
一方向の通信だったらもともとうまく動いていたので、期待するタイミングでピタッと衝突できないと確認できんのだが、それってできるきがしない。。。


ともかく、みんなこんなプログラムを作るときどうやってるんだろう??
私が知らないだけで、実は便利なフレームワークやライブラリがあるのだろうか。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。