Pergunta

Assim como no título. É suspeito que é, mas eu não poderia encontrá-lo em qualquer lugar explicitamente declarado. E para esta propriedade que eu não gostaria de contar com especulações.

Foi útil?

Solução

Se você usar o multithreaded versão do a CRT, todas as funções são thread-safe, porque qualquer informação específica do segmento é armazenado em TLS . rand_s realmente não usa informações de estado, em primeiro lugar, uma vez que apenas chama uma API OS, então questão de thread-segurança não surge para rand_s. rand (), no entanto, depende de um valor de semente para gerar um número aleatório.

Outras dicas

Chris disse: rand() não é thread-safe, porque o seu estado interno é estático, mas rand_s() deve ser thread-safe, no entanto

.

Jeff acrescentou, porém, que com a versão multithreaded do MSVCRT, estado de rand() é realizada no armazenamento local de segmento, por isso é bom ainda.

Visual Studio vem com a fonte para a biblioteca de tempo de execução. Enquanto alguns pode ser bastante doloroso para percorrer, rand_s () é bastante simples.

Todos os rand_s () faz é chamada SystemFunction036 () in ADVAPI32.DLL para obter o valor aleatório. Nada em ADVAPI32.DLL deve ser thread-safe.

Por sua parte, rand_s () obtém o ponteiro para essa função em uma forma thread-safe.

Eu não sei se rand_s é thread-safe, mas parece que provavelmente é, uma vez que parece fazer uma ida e volta para o sistema operacional para a entropia. (Contanto que você ligar para o VC ++ multi-thread CRT, todas as apostas estão fora se você ligar para o single-thread)

Se for suportado pelo Windows CRT, você pode tentar uma chamada para rand_r que é a versão POSIX reentrada de rand. Ou melhor ainda boost :: aleatória, se você já está usando o impulso.

considerando o quão generalizada multi-threading será em breve, ninguém deve usar rand () mais no novo código -. Sempre tentar usar rand_r / rand_s / boost / vários rands seguras dependente de plataforma / etc

Eu não posso pensar em qualquer razão para que rand_s () ou mesmo rand () não seria thread-safe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top