2009-10-02 9 views
0

Je travaille avec un système qui utilise les GUID comme clés dans la plupart des tables de base de données. Les guids sont créés en utilisant UuidCreateSequential, afin d'être gentil avec les index de base de données.Sécurité des threads des appels U/uCreateSequential et p/invoke en général

C++ syntaxe, selon http://msdn.microsoft.com/en-us/library/aa379322(VS.85).aspx:

RPC_STATUS RPC_ENTRY UuidCreateSequential(
    UUID __RPC_FAR *Uuid 
); 

p/invoke.net suggère la signature suivante:

[DllImport("rpcrt4.dll", SetLastError=true)] 
static extern int UuidCreateSequential(out Guid guid); 

La question est - comment puis-je savoir si cette méthode est sûr d'invoquer de plusieurs threads simultanément? Les tests initiaux montrent que cela peut être sûr, mais je n'ai trouvé aucune information significative à ce sujet sur MSDN ou Google. Existe-t-il une convention standard concernant les appels à l'API Windows sur laquelle je peux compter?

Répondre

1

Il est généralement prudent de supposer que la plupart des API Windows sont thread-safe.

Un ID global unique doit pouvoir être créé à partir de n'importe quelle application du système à tout moment. Par conséquent, je dirais que la sécurité des threads est une caractéristique requise d'un générateur GUID. RFC 4122 décrit une méthode pour générer des GUID qui devrait être assez proche de ce que Windows fait réellement. Notez qu'il mentionne l'obtention d'un verrou global qui serait nécessaire pour s'assurer que les appels simultanés pour créer un GUID ne peuvent pas obtenir la même valeur.