1

、、、、を使用open() [O_RDWR | O_NONBLOCK]してデバイス ファイルを操作する C++ コンソール アプリがあります。現在の操作をキャンセルするために呼び出すこともできます。常に 1 人のユーザーのみがデバイスで作業できます。write()select()read()close()ioctl()

データがデバイスから利用可能になったときに発生する libsigc++ シグナルを持つ C++ クラスを考え出す必要があります。

問題: 呼び出し元のselect()アプリケーションがデータを待っているときに応答しなくなったとき。レスポンシブにする方法 -select()ワーカースレッドを呼び出すことによって? もしそうなら - ワーカースレッドはメインスレッドとどのように通信しますか? 多分私は調べる必要がありますboost::asioか?

4

3 に答える 3

0

生産者と消費者のスタイルに問題があるようです。この問題の解決策を実装するにはさまざまな方法がありますが、最近ではほとんどの人が条件変数ベースのアプローチを使用する傾向があります (このC++11 ベースの例を参照してください)。

また、実装すると同時実行性の問題を軽減するのに役立つ設計パターンがいくつかあります。

半同期 / 半非同期
  • キューをイベントで満たす非同期レイヤーと、それらのイベントを処理する同期レイヤーとの間にキューを導入するプロデューサー/コンシューマー スタイルのパターン。
リーダー/フォロワー
  • 複数のスレッドが順番にイベントを処理します
  • 関連する議論はここで入手できます。
于 2013-05-21T20:16:44.240 に答える
0

レスポンシブにする方法 - ワーカースレッドで select() を呼び出すことによって

dup()を使用できます。これにより、ファイル記述子が複製されます...したがって、読み取り操作全体を別のスレッドに移動できます。したがって、読み取り [select()] スレッドがスリープ状態であっても、書き込みスレッドと処理スレッドは応答します。

libsigc++ のシグナル発信オーバーヘッドは最小限であるため、読み取りスレッド自体にコードを埋め込むことができると思います。スロットは別のスレッドに存在できます。これがシグナルを受け取る場所です...

Thriftは libsigc++ を使用していませんが、Thrift のソース コード [完全にブースト ベース] に興味があるかもしれません

于 2012-10-07T11:54:12.860 に答える