1

問題は単純ですが、解決策 (存在する場合) は非常に複雑だと思います。とにかく、私は現在、単純なトランザクション処理 (PRINT、ADD、SLEEP、ASSIGN など) をスレッドを使用して並列に実装することになっている分散アプリケーションを開発しています (この割り当てには Pthreads を使用しています)。予想通り、競合する複数のトランザクション (最大 20 件) を同時に処理しようとすると、デッドロックが発生するという問題がありました。

ここで、各スレッドのトランザクション処理に多数の再試行を実装することにしました。これは、基本的にランダムに生成され、正確にその順序で呼び出されますsrand(time(NULL))rand()問題は、(最大 5 つの異なるサーバーで) 複数のトランザクションを処理する場合、基本的に同じ秒で生成されるため、数値が一致することです。

だから、私の質問は、関数を使用せずに整数を完全にランダムに生成する方法はありtime()ますか?

助けてくれてありがとう、そして(あまりにも)長い説明でごめんなさい。

4

3 に答える 3

1

異なるスレッド間で独立した擬似乱数ジェネレーター PRG を使用するには、もう少し注意する必要があります。基本的に、ジェネレーターの状態をスレッドごとに個別の変数に保持し、スレッドごとに異なるもので各状態を一度だけ初期化する必要があります。たとえば、初期化に時間とスレッド ID を使用します。

あなたはPOSIXシステムを使用しているのでjrand48、ジェネレーター関数として使用できますが、状態を引数として渡すことができるランダムジェネレーターは問題ありません。

于 2013-06-13T22:00:33.283 に答える
0

srand()へのすべての呼び出しの前に呼び出すべきではありませんrand()。それがあなたの問題の根本原因です。代わりに、srand()スレッドを作成する前に、プログラムの起動時に一度だけ呼び出す必要があります。

さらに、rand()POSIX ではスレッドセーフである必要はないため、ミューテックスを使用して、異なるスレッドからのアクセスをシリアル化する必要があります。

于 2013-06-14T05:03:51.743 に答える