[英]Creating random numbers in a multithreaded program in C
我正在編寫一個程序,其中有工作線程創建0到3之間從0到x-1(變量)的隨機數
我需要學習的是如何在C中生成這些隨機數。
我正在使用gcc編譯器並在Ubuntu 11.10上工作
rand()
& srand()
不是那種可以安全使用的東西。
它們既不是重入也不是線程安全 。 一般而言,C或C ++標准都不對任何標准庫函數提出有關線程安全性的任何要求。
某些實現可能確實提供了線程安全版本,但標准並未強制要求。
為了能夠在多線程環境中使用隨機數生成器,您將需要一個允許傳入狀態的實現。 這樣,您可以為每個線程保留一個狀態值,並生成高質量的隨機數,而無需同步。
C標准庫不提供任何選擇。 這使得100%的可移植性變得相當不可能。使用的選擇將取決於您的環境,您應該將其作為問題的一部分來提供以獲得准確的答案。
看看聲稱提供MultiThreaded隨機數發生器的 GNU科學圖書館 。
如果你只是想要一些隨機數並且不關心是否獨立生成隨機數序列,你仍然可以使用rand()
和srand()
。
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void* cb1(void*) {
while(1) {
printf("cb1, rand:%d\n",rand());
sleep(1);
}
}
void* cb2(void*) {
while(1) {
printf("cb2, rand:%d\n",rand());
sleep(1);
}
}
int main() {
pthread_t th1, th2;
srand(1);
pthread_create(&th1, NULL, cb1, NULL);
pthread_create(&th2, NULL, cb2, NULL);
pthread_join(th1, NULL);
pthread_join(th2, NULL);
return 0;
}
使用rand_r()
(見rand(3))
函數rand_r()提供了一個指向unsigned int的指針,用作狀態。
它是可重入的並且將種子作為輸入,因此線程可以分別管理它們的種子。
一個真理和美麗的東西;
http://en.wikipedia.org/wiki/Mersenne_twister
編寫自己的RNG。
(道歉。我剛看了那個維基頁面。最后我看了一會兒,很好;你可以讀它並實現扭轉。現在這是一堆學位水平的數學,這對任何人都沒有任何解釋,禁止在大學學習數學學習四年的人口子集。我看到這在維基上發生了很多:-(
一個簡單的版本,缺少錯誤檢查,使用C11的threads.h
看起來像這樣:
mtx_t rand_mtx;
//run only once.
int rand_init(int seed)
{
srand(seed);
mtx_init(&rand_mtx, mtx_plain);
}
int synced_rand()
{
mtx_lock(&rand_mtx);
int r = rand();
mtx_unlock(&rand_mtx);
return r;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.