1

1 つの送信スレッドと 40 のワーカー スレッドがあります。キューは 1 つです。40 個のスレッドすべてがキューに書き込み、送信側スレッドは定期的に共有キューから読み取り、読み取ったデータを TCP ソケット経由で送信します (たとえば、1 秒ごとに、送信側スレッドはキューからデータを読み取り、ソケット経由で送信する必要があります)。 )。ここで質問があります:

  1. 40 個のスレッドのいずれかがクリティカル セクションにあり、他のすべてのスレッドもクリティカル セクションに入るのを待っていて、同時に 1 秒のタイマーが作動していて、クリティカル セクションに入る他のすべてのスレッドの要求を無視したい場合、また、送信側スレッドに優先順位を付け、クリティカル セクションを指定する必要があります。

つまり、送信スレッドの優先度を 1 に設定したいということです。つまり、送信スレッドが EnterCriticalSection() を呼び出すと、クリティカル セクションに入るのを待っている他のすべてのスレッドを無視する必要があり、クリティカル セクションが解放されるとすぐに、送信者スレッドに渡されます。この機能を実現する方法はありますか?

4

4 に答える 4

2

ワーカースレッドのいずれかがロックを保持している場合、優先度はそれらに強制的に解放させることができないため、優先度だけを使用してそれを達成することはできません。ここに私が考えることができる1つの実装があります..

送信側スレッドが 1 秒後にウェイクアップするとすぐに、ワーカー プロセスにシグナルが送信されます。そして、シグナルハンドラーでワーカーが保持しているロックを解放します(ここではバイナリセマフォが良いと思いますので、シグナルハンドラーで値を0にします)、ワーカースレッドがアクセスしようとするとブロックされます。送信側ですべてのパケットを送信し、最後にセマフォを 1 に戻します。

これは 1 つの実装です。自分でそのように考えることができますが、最終的にはうまくいくはずです。:)

于 2013-07-03T06:56:31.043 に答える
1

おそらく、リーダー/ライター ロックの変形が必要なだけでしょう。そしておそらく単純な Win32 クリティカル セクション ロックだけで十分です。

理由は次のとおりです。クリティカル セクションの操作であるキューへのデータの追加 (またはキューからの読み取り) は、非ブロッキング操作です。つまり、キューでの操作に 1 ミリ秒未満の時間がかかることはありません。Windows クリティカル セクション ロック(EnterCriticalSection、LeaveCriticalSection)を使用すると、CS に入るのを待っているスレッドに対して公平性が保証されます (私はこれについてかなり確信しています)。

したがって、40 個のライター スレッドすべてがキューに追加するために CS に入る必要がある場合、リーダー スレッドが待機するのに 1 ~ 2 ミリ秒以上かかることはなく、ロックを取得する番です。これはもちろん、ライター スレッドがメモリをキューにコピーするだけであり、ロックを取得している間は長時間のブロッキング I/O 操作を行わないことを前提としています。

于 2013-07-03T07:01:53.790 に答える
0

あなたの問題に対する可能な解決策の1つは、Linuxでのスレッドの実装方法にあります。Mutex を試してみてください。Sender スレッドに名前付き FIFO を (mkfifo()呼び出しを使用して) 作成させます。また、たとえば 40 個のワーカー スレッドを作成するときに、それぞれの関数で、受信用の名前付き FIFO を作成させます。Sender スレッドが Worker スレッドの 1 つと通信したい場合はいつでも、open()call を使用して worker_fifo を開き、それに書き込み、閉じます。しかし、ユーザークライアントアプリケーションのようなものがある場合は、fifo を開くたびに Mutex ロックを設定し、必要なこと (読み取り/書き込み) を行い、Mutex のロックを解除します。

于 2013-07-03T07:40:26.973 に答える
0

これが問題の解決に役立つことを願っていますhttp://man7.org/linux/man-pages/man3/pthread_getschedparam.3.html

于 2013-07-03T06:56:32.813 に答える