2010-11-21 5 views

Répondre

5

Il dépend de votre plate-forme pour savoir si vous aurez des problèmes de multithreading. Sur les fenêtres que vous seriez mieux loti faire ce qui suit:

int returnUniqueNumber() 
{ 
    volatile static long l = 0; 
    return (int)InterlockedIncrement(&l); 
} 

Les Interlocked* fonctions sont garanties atomiques.

+0

Vous ne devriez pas émis le 'statique int * 'à un' long volatile '--rather, il devrait être un 'LONG *' (qualifié de façon appropriée) dans les deux cas, et être converti en un 'int' en retour (ou simplement implicitement par la fonction.)' long 'et' int' (et Windows ''LONG' typedef) ne sont pas toujours de la même taille, et bien que cette distribution puisse être bien sur Windows, elle encourage les mauvaises habitudes. :) –

+0

@Jonathan: Point pris, Fixe. – Goz

+0

Je vous salue, monsieur. +1 pour vous et +1 pour un code simple et précis! –

3

Si votre application était monothread , le code que vous avez posté serait en fait le bon moyen, en C/C++, de générer des nombres uniques. Cependant, puisque vous recherchez une solution sans risque pour les threads, vous devez plonger dans des solutions spécifiques à la plate-forme. Goz a une bonne solution Windows. Un équivalent sur Mac OS X ou iOS serait:

int returnUniqueNumber_APPLE(void) { 
    static volatile int32_t i = 0; 
    return (int)OSAtomicIncrement32Barrier(&i); 
} 

Sur un système où vous compilez avec GCC récente ish, vous avez également des intrinsics de GCC:

int returnUniqueNumber_GCC(void) { 
    static volatile int i = 0; 
    return __sync_add_and_fetch(&i, 1); 
} 
+0

On dirait que nous avons couvert Windows, Linux & MacOS :) –

+0

Pas seulement Linux, mais la plupart des * NIX. :) En fait, nous avons à peu près tous les principaux systèmes modernes couverts. Il se peut qu'Android soit le seul restant, et vous pouvez simplement lancer un mot-clé 'synchronized' avant le type de retour de la fonction et être fait. (Est-ce que Java a des opérations atomiques appropriées? Et je ne veux pas dire "AtomicInteger", etc.) –