2009-03-05 18 views
4

並行コールがseg-vを引き起こさないか同じ値を返さない限り、PRNGsの競合状態とデータ破損を防止するための理由は、これらのエラーの主な影響が予測できない結果であってPRNGのポイントですか?PRNGはスレッドセーフである必要がありますか?


編集:は競合状態やデータ破損の下で苦しむない任意のPRNGがあるのですか?

+0

PRNGとは何か不足していますか? –

+0

英語:それを愛する必要があります。 – BCS

+0

@BCS - あなたがそれをしている間にタイトルを修正するかもしれません... –

答えて

3

PRNGは慎重に構築されたツールです - 率直に言えば、競合状況やスレッドのバグが良好なPRNGだった場合、実装はそのように書かれます。

ランダム性を高めるためにスレッドのバグを追加する際の問題は、未定義ののジェネレータへの変更です。既存のセキュアなアルゴリズムと実装は徹底的にテストされています。あなたが安全でない変種を試してみたいのであれば、それが少なくとも普通のPRNGと同じくらいランダムであることを示すために統計的な面倒な作業をする必要があります。

+1

私は意図的にスレッディングバグを追加することを言及していませんが、それらを避けるためにあなたの方法から外に出ていません。 – BCS

+0

十分に公正ですが、edgewaysでバグが潜んでいれば効果は同じになります。 ;)静的同期クラスをPRNGの呼び出しの周りにラップするオプションがある場合は、それが最も簡単です。私は本当に良いPRNGがアトミックになるのに十分小さなステップ操作で構築できるかどうか疑問です。 – ojrac

+0

アトミックなステップ操作でPRNGを作成することはできませんが、APPEARSがアトミックになるように簡単に作成でき、高価なスレッドロック呼び出しを避けることができます。私は例を挙げますが、PRNGは実際に一般的な例を与えるにはあまりにも多岐に渡ることがあります。ロックフリーのコードを手に入れるのは難しいことですが、それを理解していれば、それ以外の場合は、学習と試行錯誤がありますが、その前に完全に異なるアルゴリズムに1つの概念を適用することができます。 –

5

これらのエラーの主な影響は予測できない結果であり、それがPRNGのポイントですか?

「ランダム」は予測不可能なものと同じではありません - ランダムとは、実際の乱数が必要な場合は、維持することが非常に重要な特定の分布を意味します。あなたの乱数が何らかの形で予測可能な場合は、セキュリティ上の問題または少なくともプログラムのバグになる可能性があります。

0

一般に、それらは決定論的ではない(多くの人が行う決定論に頼ると悪い)。特定のインプリメンテーションの詳細やハードウェアの動作の微妙さに応じて、疑似ランダムを少なくすることはできません。

しかし、一般にマルチスレッドのアプリケーションを書く人々は、TLS(スレッドローカルストレージ)でPRNG状態を宣言します。この方法は問題ではなく、すべてのスレッドは独自のPRNGを持っており、意図的にそれらを作成しない限り、レースは起こりません。とにかくPRNGコードの中にはありません。これはロックフリーであり、多かれ少なかれ完全なパフォーマンスです(使用されるTLS実装に依存します)。

関連する問題