簡體   English   中英

如何使用rand_r()在C中創建線程安全隨機數生成器?

[英]How to create thread-safe random number generator in C using rand_r()?

我被要求不要使用rand()因為它們不是“線程安全的”,並且每次也使用不同的種子值。 我在GitHub上找到了使用像這樣的種子值的示例:

unsigned int seed = time(NULL);

那只有幾秒鍾的精度。 由於程序運行時間不到1秒,因此我最終在每個實例中獲得了相同的隨機數。

如何解決此算法,使其僅使用rand_r()或任何其他“線程安全”的方法來生成10個隨機數?

int main()
{
    for(int i = 0; i < 10; i++){
        int random;
        unsigned int seed = time(NULL);
            random = 1 + (rand_r(&seed)% 10);
        printf("%d\n",random);
    }
 return 0;
}

rand_r函數采用一個指向狀態變量的指針。 在第一次調用rand_r之前,將其設置為種子值。 然后,每次調用rand_r ,您都傳遞此值的地址。

為了線程安全,每個線程都需要有自己的狀態變量。 但是,您不想為每個線程的狀態變量使用相同的初始值,否則每個線程將生成相同的偽隨機值序列。

您需要為狀態變量添加每個線程不同的數據(例如線程ID)以及其他信息(例如時間和/或pid)。

例如:

// 2 threads, 1 state variable each
unsigned int state[2];

void *mythread(void *p_mystate)
{
    unsigned int *mystate = p_mystate;
    // XOR multiple values together to get a semi-unique seed
    *mystate = time(NULL) ^ getpid() ^ pthread_self();

    ...
    int rand1 = rand_r(mystate);
    ...
    int rand2 = rand_r(mystate);
    ...
    return NULL;
}

int main()
{
    pthread_t t1, t2;

    // give each thread the address of its state variable
    pthread_create(&t1, NULL, mythread, &state[0]);
    pthread_create(&t2, NULL, mythread, &state[1]);
    ...
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM