0

多くのPOSIXスレッドがあり、シリアルポートから読み取る2つのリーダーと、ファイル記述子を使用して同じポートに書き込む他のリーダーがあります。それらの間で同じ記述子を共有するにはどうすればよいですか?セマフォによってすべてのスレッド間で読み取り/書き込みアクションと書き込み/書き込みアクションを同期しました。

注:ファイル記述子は同じプロセスのスレッド間で共有する必要があると思いますが、EBUSY2番目のリーダーがポートから読み取ろうとすると、コードがエラーで実行されません。(前に質問した)

アップデート

これは少し奇妙な状況です。実行時にスレッドが1つしかない場合でも、エラーで戻ったread()後に呼び出すと。多分私は間違った質問をしている。デバイスが無料であることを確認するために、それぞれの後に何らかの種類があるはずですか?またはどういうわけかブロックするように強制しますか?write()-lEBUSYflushwrite()write()

4

2 に答える 2

1

明らかに、EBUSY戻りコードはポートが使用中であることを示しており、後で再度照会する必要があります。コマンドが通過するまで、スレッドは少し待ってから再試行する必要があります。

コメントの1つで、ポートの背後にあるシステムは機械的なシステムであると述べています。これは、コマンドが処理されるまでに少し時間がかかる理由を説明しています。

「IOを処理する1つのスレッド」が最善のアプローチだと思います。各読み取り/書き込みはスレッドをブロックし、EBUSY目撃している問題を回避します。std::queueあとは、コマンドキューを実装するだけです(すべてのアクセスを同期するためのミューテックスは1つだけで、非常に簡単です)。

更新:更新を読んで、EBUSYコマンドの実行が非常に遅く、システムコールが戻ってから少し経ってから、1つのスレッドがIOを実行している場合でも、IOが発生する可能性があることを示していると思います。答えの冒頭で述べたように、スレッドを少し待ってからコマンドを再発行してください。そうすれば、それでうまくいくはずです。

于 2012-12-16T06:27:29.057 に答える
0

'O_NONBLOCK'フラグでファイルを開きます。

于 2012-12-18T14:33:48.003 に答える