1

strongswan のソース コードからスレッドを同期する別の方法を見つけました。スレッドのスケジュール ポリシーを変更してスレッドを同期します( SCHED_FIFO)。途中で何かメリットあるのmutex

コード:

int oldpolicy;
struct sched_param oldparams, params;
pthread_getschedparam(thread_id, &oldpolicy, &oldparams);
params.__sched_priority = sched_get_priority_max(SCHED_FIFO);
pthread_setschedparam(thread_id, SCHED_FIFO, &params);

...
critical section
...

pthread_setschedparam(thread_id, oldpolicy, &oldparams);

PS: strongswan は malloc フックを使用してメモリ リークを検出します。マルチスレッドをサポートするために、この方法を使用してスレッドを同期します。

PPS:彼らはコードを変更したようです。バージョン Strongswan 4.5.0 のそのコード片。

4

2 に答える 2

4

それは何も同期しません!

これにより、クリティカル セクションの実行中にスレッドが CPU からスケジュールされるのを防ぐことができます。現在、複数の CPU があり、別のスレッドが別の CPU で実行できるため、何も除外されません。また、プリエンプションを完全に防止することさえできません。ページフォルトまたはその他の IO を待機している場合、スレッドは引き続きスリープ状態になる可能性があります。

その理由は、他のスレッドが続行できない非常に重要な何かが計算されているときに、他のスレッドが枯渇するのを避けるためです。それはその原因に役立ちますが、非常に特殊なケースです (「優先順位の逆転」を検索してください)。

于 2013-09-30T11:19:01.893 に答える
3

同じコアに競合する可能性のあるすべてのスレッドをロックしない限り、複数のコアがある場合は壊れています。それでも、I/O でブロックすると壊れてしまいます。(たとえば、ページ フォールト)。

于 2013-09-30T11:18:25.187 に答える