2017-01-30 55 views
1

我想知道igraph_rng_default()是否給出了一個線程安全的隨機數生成器,如果是這樣的話,我應該使用什麼樣的rng?此外,如果您在每個線程中調用igraph_sbm_game,那麼這些圖的生成是線程安全的?Igraph隨機數發生器在c


編輯: 更清楚,這是我在我的節目中寫道:

#define N 2048 
    #define R 16 
    #define rngseed 1763984 
int main(void) 
{ 
    igraph_rng_seed(igraph_rng_default(), rngseed); 
#pragma omp parallel shared(some_shared_variables) private(some_private_variables) 
{ 
    igraph_matrix_t pref_matrix;  
    igraph_matrix_init(&pref_matrix, R, R); 
    igraph_vector_int_t block_sizes; 
    /*SBM initialization*/ 
    igraph_vector_int_init(&block_sizes, R); 
    ... 
    ... 
    #pragma omp for ordered schedule(static,1)//ordered schedule(static,1) per risultati in ordine #pragma omp ordered per stampare in ordine  
    for(q1=0;q1<100;q1++) 
    { 
     igraph graph; 
     igraph_sbm_game(&graph, N, &pref_matrix, &block_sizes, IGRAPH_DIRECTED, IGRAPH_NO_LOOPS); 
     .... 
    } 
    } 

我的問題是,既然igraph_sbm_game基於所選擇的RNG隨機圖,這是隨機性保證線程安全?換句話說,使用默認的igraph隨機數生成器,我可以通過線程安全的方式獲得隨機數嗎?我懷疑來自igraph_sbm_game()函數不需要種子和我無法找到igraph使用哪個隨機數生成器的事實...

+0

我認爲你應該詳細說明這個問題。線程安全隨機數發生器是什麼意思?你試過了,發現了一些問題?另見[問]。 –

+0

即使它是線程安全的,爲每個線程使用單獨的RNG可能會更好,因爲那樣就沒有機會競爭默認的RNG。 –

+0

如何在不同的線程中調用單獨的rngs? –

回答

1

igraph不是線程設計的 - 安全 - 在線程之間共享某些數據結構(例如,在函數的過程中爲igraph分配的指針的全局「清除」堆棧),因此從同一時間調用兩個igraph函數是不安全的不同的線程。這可能會回答你原來的問題:不,隨機數發生器也不是線程安全的。

./configure腳本中有一個實驗開關(--enable-tls),如果編譯器支持它,它會將全局數據結構移動到線程本地存儲中。只要您不操作來自不同線程的相同圖(或者使用鎖定來協調對圖的訪問),這就有可能使igraph成爲線程安全的。但是,這並沒有經過徹底的測試,所以請謹慎操作。