É rand_s do Windows' thread-safe?
-
02-07-2019 - |
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.
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.