OpenSSL与OpenMP一起使用,导致分段错误

OpenSSL与OpenMP一起使用,导致分段错误,openssl,segmentation-fault,openmp,Openssl,Segmentation Fault,Openmp,我在C中使用OpenSSL搜索双安全素数p。也就是说,我在寻找素数p,使得p=2p+1和p=2p'+1,p和p'也是素数。这个搜索需要很长时间,所以我使用OpenMP来进行多线程处理。这是我的密码: BIGNUM*p、*p_temp、*p、*p_temp、*temp1、*temp2; BN_CTX*CTX; ctx=BN_ctx_new(); p=BN_new(); p_temp=BN_new(); P=BN_new(); P_temp=BN_new(); temp1=BN_new(); tem

我在C中使用OpenSSL搜索双安全素数p。也就是说,我在寻找素数p,使得p=2p+1和p=2p'+1,p和p'也是素数。这个搜索需要很长时间,所以我使用OpenMP来进行多线程处理。这是我的密码:

BIGNUM*p、*p_temp、*p、*p_temp、*temp1、*temp2;
BN_CTX*CTX;
ctx=BN_ctx_new();
p=BN_new();
p_temp=BN_new();
P=BN_new();
P_temp=BN_new();
temp1=BN_new();
temp2=BN_new();
int-doublesafe;
int-found;
int-ID;
omp_设置_数量_线程(150);
#pragma omp parallel private(双重安全、p_temp、p_temp、temp1、temp2、ID)共享(已找到、p、p、ctx)
{
ID=omp_get_thread_num();
printf(“\n线程%d”,ID);
发现=0;
而(!found){
BN_generate_prime_ex(p_temp,1536,1,NULL,NULL,NULL);
BN_集_字(temp1,2);
BN_-mul(P_-temp,temp1,P_-temp,ctx);
BN_add(P_temp,P_temp,BN_value_one());
doublesafe=BN_是素数(P_temp,10,ctx,NULL);
如果(双重安全){
#pragma-omp-critical
{
如果(!找到){
发现=1;
BN_mul(P,P_temp,BN_value_one(),ctx);
BN_mul(p,p_temp,BN_value_one(),ctx);
printf(“\n找到P!%d”,ID);
}
}
}
}
}
//求素数p的并行块到此结束
运行此操作时,我遇到一个分段错误:

>Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffb1ae8e700 (LWP 141701)]
0x00007ffff7a9b160 in BN_mod_word () from /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
>(gdb) bt
>#0  0x00007ffff7a9b160 in BN_mod_word () from /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
>#1  0x00007ffff7a9d2dd in ?? () from /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
>#2  0x00007ffff7a9dd5c in BN_generate_prime_ex () from /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
>#3  0x0000000000401e0f in main._omp_fn.0 () at myprogram.c:265
>#4  0x00007ffff77f734a in ?? () from /usr/lib/x86_64-linux-gnu/libgomp.so.1
>#5  0x00007ffff75d9184 in start_thread (arg=0x7ffb1ae8e700) at pthread_create.c:312
>#6  0x00007ffff730603d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111
知道原因是什么吗

我按照祖兰的建议更新了代码。它工作过一次,但当我再次运行它时,它抛出了分段错误。更新代码:

   BIGNUM *p, *P;
   BN_CTX *ctx;
   ctx = BN_CTX_new();
   p = BN_new();
   P = BN_new();
   int found=0;
   omp_set_num_threads(150);
   #pragma omp parallel shared(found,P,p,ctx)
   {
      int ID = omp_get_thread_num();
      printf("\n thread %d", ID);
      int doublesafe=0;
      int local_found=0;
      BIGNUM *P_temp, *p_temp, *temp1;
      p_temp = BN_new();
      P_temp = BN_new();
      temp1 = BN_new();

      while(!local_found){
      BN_generate_prime_ex(p_temp,1536,1,NULL,NULL,NULL);
      BN_set_word(temp1,2);
      BN_mul(P_temp, temp1, p_temp, ctx);
      BN_add(P_temp, P_temp, BN_value_one());
      doublesafe = BN_is_prime_ex(P_temp,10,ctx, NULL);
      if(doublesafe){
      #pragma omp critical
      {
         if(!found){
         found = 1;
         BN_mul(P, P_temp, BN_value_one(),ctx);
         BN_mul(p, p_temp, BN_value_one(),ctx);
         printf("\n found p and P! %d", ID);
      }
      }
      }
    #pragma omp atomic read
    local_found = found;
    }
    }
    //the parallel block for finding safe prime p ends here
我发现以下seg故障:

>Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffb6171b700 (LWP 143091)]
0x00007ffff7a9700c in BN_set_word () from /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
>(gdb) bt
>#0  0x00007ffff7a9700c in BN_set_word () from /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
>#1  0x00007ffff7a97c45 in BN_CTX_get () from /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
>#2  0x00007ffff7a9d482 in BN_is_prime_fasttest_ex () from /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
>#3  0x0000000000401c36 in main._omp_fn.0 () at myprogram.c:257
>#4  0x00007ffff77f734a in ?? () from /usr/lib/x86_64-linux-gnu/libgomp.so.1
>#5  0x00007ffff75d9184 in start_thread (arg=0x7ffb6171b700) at pthread_create.c:312
>#6  0x00007ffff730603d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111
>(gdb) 
更新:

我注意到调用函数如下

BN_generate_prime_ex(BIGNUM *ret, int bits, int safe, const BIGNUM *add, const BIGNUM *rem, BN_GENCB *cb);

在平行区域中,大部分时间(并非总是)都会抛出分段错误。当我注释掉这些函数时,程序运行良好

有人知道怎么处理吗


我遇到了分段错误,尽管我遵循了关于使用两个回调函数等的建议。

私有变量未在并行区域内初始化!您必须手动初始化它们——更好的是:在并行区域本身中本地声明它们,然后它们是隐式私有的,更容易发现。尽可能在本地声明所有变量,并在声明时对其进行初始化


同时,您的
发现
-循环也是错误的。如果另一个线程写入了
found
,则不能读取未受保护的内容。即使写操作恰好受到保护。一个解决方案是取消,或者您可以使用取消。

谢谢,我遵循了这两个建议,现在它正在工作。:)实际上,它只工作了一次,再次运行时抛出seg故障。
BN_is_prime_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, BN_GENCB *cb);