2008-09-25 65 views
8

這是代碼:正在讀/ dev/urandom線程安全嗎?

 
    unsigned int number; 
    FILE* urandom = fopen("/dev/urandom", "r"); 
    if (urandom) { 
    size_t bytes_read = fread(&number, 1, sizeof(number), urandom); 
    DCHECK(bytes_read == sizeof(number)); 
    fclose(urandom); 
    } else { 
    NOTREACHED(); 
    } 

如果沒有,我如何使它線程安全的?

回答

10

只要函數的每一次執行是在自己的線程(即局部變量numberurandombytes_read不是線程之間共享),我沒有看到任何線程安全問題。然後每個線程將擁有自己的文件描述符到/dev/urandom/dev/urandom可以同時從多個進程打開,所以沒關係。

順便說一句,/dev/urandom可能無法打開,您的代碼應該處理它。一些原因是:缺少可用的文件描述符; /dev沒有正確安裝(儘管在這種情況下你有更大的問題);你的程序正在運行在一個特殊的chroot,它拒絕訪問任何設備;等等。

+0

顯然它應該是安全的,爲了理智的緣故,但我無法找到任何指定它的隨機4中的任何東西。例如,如果urandom已經回到PRNG模式,兩個同時的呼叫者能否看到相同的輸出,而不是偶然?當然不是,但是文檔不說什麼? – 2008-09-25 14:20:13