C语言中的Igraph随机数生成器

3
我想知道igraph_rng_default()是否提供线程安全的随机数生成器,如果是这种情况,我应该使用哪个rng?此外,如果您在每个线程中调用igraph_sbm_game,则生成这些图形是线程安全的吗?
编辑: 要更清楚,请看我在程序中编写的内容:
  #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根据所选的随机数生成器生成随机图,这种随机性是否保证是线程安全的?换句话说,使用默认的igraph随机数生成器,我可以以线程安全的方式获得随机数吗?我的疑问来自于igraph_sbm_game()函数不需要种子以及我找不到igraph使用哪个随机数生成器...

我认为你应该详细说明问题。你所说的线程安全随机数生成器是什么意思?你尝试过它并发现了一些问题吗?另请参见[ask]。 - terence hill
即使它是线程安全的,最好为每个线程使用单独的随机数生成器(RNG),这样就不会出现默认的随机数生成器竞争的可能性。 - G. Sliepen
在不同的线程中如何调用独立的rngs? - Francesco Di Lauro
2个回答

2

igraph不是为线程安全而设计的 - 某些数据结构(例如在函数过程中分配的指针的全局“清理”堆栈)在线程之间共享,因此从不同的线程同时调用两个igraph函数是不安全的。这可能回答了您最初的问题:否,随机数生成器也不是线程安全的。

在其 ./configure 脚本中有一个实验性开关(--enable-tls),如果编译器支持,它将全局数据结构移动到线程本地存储中。只要您不从不同的线程操作相同的图表(或者使用锁定来协调对图表的访问),这有潜力使igraph线程安全。但是,这还没有经过彻底测试,因此请小心进行。


1

以下是适用于 igraph 版本 0.9.x 的一些更新:

正如其他答案所述,当启用线程局部存储时,igraph 的线程支持有限。要启用线程局部存储,请在构建 igraph 时将 set IGRAPH_ENABLE_TLS 设置为 ON

与线程支持相关的问题在此处有记录:

简而言之:
  • 如果启用了线程支持,则宏 IGRAPH_THREAD_SAFE 被定义为 1
  • 默认的随机数生成器在启动时不是线程安全的。
  • 您需要使用 igraph_rng_set_default() 显式地初始化、设置和为每个线程设置一个单独的随机数生成器。只有这样,才能安全地使用从多个线程中获取的随机数的 igraph 函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接