Domanda

Proprio come nel titolo. È sospetto che lo sia, ma non sono riuscito a trovarlo da nessuna parte dichiarato esplicitamente. E per questa proprietà non vorrei fare affidamento su speculazioni.

È stato utile?

Soluzione

Se si utilizza la versione multithread di CRT, tutte le funzioni sono thread-safe, poiché tutte le informazioni specifiche sul thread sono archiviate in TLS . rand_s in realtà non utilizza le informazioni sullo stato in primo luogo, poiché chiama semplicemente un'API del sistema operativo, quindi non si pone la questione della sicurezza dei thread per rand_s. rand (), tuttavia dipende da un valore seed per generare un numero casuale.

Altri suggerimenti

Chris ha detto: rand () non è thread-safe perché il suo stato interno è statico, ma rand_s () dovrebbe essere thread-safe, tuttavia.

Jeff ha aggiunto tuttavia che con la versione multithread di MSVCRT, lo stato di rand () è conservato nella memoria locale del thread, quindi va bene ancora.

Visual Studio viene fornito con l'origine nella libreria di runtime. Mentre alcuni di questi possono essere piuttosto dolorosi da superare, rand_s () è piuttosto semplice.

Tutto ciò che fa rand_s () è chiamare SystemFunction036 () in ADVAPI32.DLL per ottenere il valore casuale. Qualsiasi cosa in ADVAPI32.DLL dovrebbe essere thread-safe.

Da parte sua, rand_s () ottiene il puntatore a quella funzione in modo thread-safe.

Non so se rand_s sia thread-safe, ma sembra che probabilmente lo sia, dal momento che sembra fare un giro di andata e ritorno al sistema operativo per l'entropia. (purché si colleghi al CRT multi-thread VC ++, tutte le scommesse sono disattivate se si collega a quello a thread singolo)

Se è supportato da Windows CRT, puoi provare una chiamata a rand_r che è la versione rientrante posix di rand. O ancora meglio boost :: random, se stai già usando boost.

considerando quanto il multi-threading pervasivo sarà presto, nessuno dovrebbe più usare rand () nel nuovo codice - cerca sempre di usare rand_r / rand_s / boost / vari rands sicuri dipendenti dalla piattaforma / etc.

Non riesco a pensare a nessun motivo per cui rand_s () o persino rand () non siano thread-safe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top