2

次のシナリオを達成する必要があります。これを手伝ってください:

  1. いくつかのオブジェクトを含むキューが維持されます。
  2. オブジェクトがキューに挿入されると、そのオブジェクトのタイマーが開始されます。
  3. そのオブジェクトでイベントが発生するたびにシグナルが送信されます (イベントは、タイムアウトやエラーなどの可能性があります)。
  4. このオブジェクトに対して発生したイベントがキャプチャされ、オブジェクト ID が受信されます。オブジェクト ID は、キューに存在するオブジェクトを識別し、適切なアクションを実行するために必要です。

多数のオブジェクトに対して機能しなかった私のアプローチは次のとおりです。

  1. オブジェクト ID を に渡し、そのオブジェクトのタイマーとしてthread_function1(void *object_id);使用する各オブジェクトのスレッドを作成します。sleep()
  2. 他のオブジェクトについては、作成して同じことを行う必要がnew thread_function2(void *object_id); あります。これを動的にしたかったため、上記のアプローチは機能しません。

オペレーティング システム: Linux。

これを c++ で実装したいのですが、これを実装したことがないので、前進するにはあなたの助けと指導が必要です。オンライン チュートリアル、リファレンスは非常に役立ちます。前もって感謝します。

4

3 に答える 3

2

さかのぼる 2004 年に、C++ タイマーの実装をテストする方法を示す「Practical Testing」という一連のブログ投稿を書き始めました。このシリーズは、単一のスレッドを使用してタイマーにサービスを提供する、完全に機能する軽量タイマー キューの多くのバージョンで構成されています (もちろん、タイマー イベントが発生したら、タイマー イベントをスレッド プールに渡すこともできますが、キュー自体には1 つのスレッドが機能します)。

コードはWindows用なので、多少調整する必要があると思います。

このコードは、各接続に 1 つ以上のタイマーが関連付けられている可能性のある何千ものネットワーク接続で動作するように設計されています。これは、10,000 以上の接続を持つシステムで使用されており、適切に機能し、効率的です。

エピソード 23 では、タイマー キューではなくタイマー ホイールを使用する代替実装を追加し、新しいデータ構造によってパフォーマンスが向上するために必要なトレードオフについて説明します。

シリーズはここから始まります。

最新の動作コードだけが必要な場合は、エピソード 31 からダウンロードできます

コードの単体テストのカバレッジは良好で (これがブログ投稿の焦点であったことを願っています)、テストはコードと一緒にダウンロードできます。

于 2013-08-11T20:33:17.623 に答える
0

簡単に言えば、sleep() を使用しないでください。これは非常に扱いにくい古いインターフェイスであるため、どのコードでも使用しないでください。

特に、sleep() は、スレッドに対する意識が最も低いわけではありません。むしろ、タイミングのニーズに合わせて pthread ライブラリの関数を使用してください。たとえば、pthread_cond_timedwait() を使用して、スレッドが特定のイベントを待機する時間を制限できます。

残念ながら、pthread ライブラリを作成した人々は、read() や write() などの標準システム コールの pthread 互換バージョンも作成するのを忘れていました。したがって、次のいずれかを待機するスレッドをプログラミングします
。A) 別のスレッドが特定の状態を通知する
B) ネットワーク接続でデータを受信する
C) タイムアウト
がまだ混乱している。解決策の 1 つは、select() および/または poll() を使用してデータ (ケース B) またはタイムアウト (ケース C) を待機し、pipe/fifo を使用して別のスレッドからシグナルを送信することです (ケース A)。そのためには、パイプの読み取り側を select() セットに追加し、条件を通知する必要がある場合は、他のスレッドにバイトを書き込むようにします。

この A/B/C シナリオの代替ソリューションは、ネットワーク データを無期限に待機する「リーダー ヘルパー」スレッドを用意することです (ケース B)。一方、メイン スレッドは A と C に対して pthread_cond_timedwait() を使用します。ヘルパー スレッドはシグナルを送信します。 pthread_cond_signalを介したデータの到着、したがって基本的にケースBをケースAに変換します.ところで:メインスレッドがいつでも接続を中止することを選択した場合、ネットワーク接続を強制的にclose()するだけで、read()も終了します待機中のヘルパー スレッドの呼び出し。

于 2013-08-11T18:14:39.343 に答える
0

イベント ループを使用する必要があります。たとえば、boost::asio timer tutorialslibevent events などです。

于 2013-08-11T17:57:49.450 に答える