2009-11-17 35 views
5

私は静的ライブラリを使用しています。現在の時刻を使用して固有のIDを作成し、それをデータベースに挿入する機能を持っています。この番号は、データベーステーブル内で一意である必要があります。スレッドIDとプロセスIDは一意ですか?

2つのプロセスが並行して実行されています。ときどき同時にこの関数を呼び出すと、同じ番号が生成されます。これが起こると、私は完全性の違反を受けます。

私は、プロセスID、スレッドID、および現在の時刻を使用することを考えています。この組み合わせはユニークですか?

プラットフォーム:Windows XP

答えて

10

データベースを使用して生成します。どのようにするかはデータベースによって異なりますが、例としてPostgres calls them sequencesです。

5

OSがプログラムを区別する必要があるため、プログラムが同時に実行されている場合、プロセス/スレッドIDは一意になります。しかし、システムはIDを再利用します。 あなたの状況では、はい、あなたのマーカーにプロセスIDまたはスレッドIDを追加することをお勧めします。私は両方が必要ではないと思います。

1

プロセスのIDとスレッドIDは一意ではありますが、スケーラビリティを制限する可能性があるため、あなたにも固有のIDを生成するためにデータベースを使用する方がよいでしょう(R. Pateが示唆しているように)ユニークなマシンID ...

マシンAで動作しているプロセスの1つがマシンBで実行中のプロセスの1つと同じプロセスIDとスレッドIDを持つことはほとんどありませんが、サポートコールに対処するために午前4時に寝る人たちを抱えるバグが...

0

まあ、プロセスIDとスレッドIDを追加すると、同じ番号につながる可能性があります

PID = 100、TID = 104 PID = 108、TID = 96

非常に可能性が高いが、不可。

ので、近くの安全なIDSのために、あなたはそれがスレッドIDがで重複しないことを前提として(ただし、これはまだ一意性を保証するものではありません

ULONG64 id = ((ULONG64)(pid&0xffff) << 48) | ((ULONG64)(tid&0xffff) << 32) | (timestamp & 0xffffffff); 

のような、少なくとも64ビットのIDフィールドが必要になります私は16ビット値を中和するプロセスIDを持っていますが、65536を超えるPIDを見たことはないと思います。何千ものスレッドを作成しない限り、スレッドIDはタイムスタンプがジャンプする前にこの値でラップされません。

3

プロセスIDとスレッドIDと時間の組み合わせは、残念ながら一意であるとは限りません。 OSは、参照されたスレッドとプロセスが終了すると、プロセスIDとスレッドIDを再利用することがあります。また、ユーザは時計を戻すことができるので、同じ時刻が2回発生する。他の人が言ったように、私はユニークなIDをデータベースに尋ねるでしょう。 Oracleにはシーケンスがあり、MySQLには自動インクリメント列があり、他のデータベースには同様のメカニズムがあります。

5

Windowsでは、スレッドIDはシステム全体で一意です。このMSDNライブラリの記事を参照:

http://msdn.microsoft.com/en-us/library/ms686746%28v=VS.85%29.aspx

のCreateThreadとCreateRemoteThread関数も一意にシステム全体のスレッドを識別する識別子を返します。スレッドはGetCurrentThreadId関数を使用して独自のスレッド識別子を取得できます。識別子は、スレッドが作成されてからスレッドが終了するまで有効です。スレッド識別子は0になりません。

+0

+1すてきな説明:) – Darren

関連する問題