c - 使用 OpenMP 时 snprintf 中的段错误

标签 c multithreading openmp

我在某处读到 snprintf 是线程安全的;然而,当我运行我的代码时,它产生了一个段错误。

主要功能:

#pragma omp parallel 
{
    #pragma omp for private(j)
    for (i = 0; i < 8; i++) {
        for (j = 0; j < 1; j++) {
            foo(gene_seq); //gene_seq is a large char array
        }
    }
}

错误的代码行:

double foo(char *gene_seq){
    char *seq;

    /* some stuff above */
    region_length = end_pos-init_pos+1; // include \0 terminator
    seq = (char *)safe_malloc(sizeof(char) * region_length);
    snprintf(seq, region_length, "%s", gene_seq + init_pos); //SIGSEGV!!!
    /*more stuff*/
}

编辑将 snprintf 行周围的程序更新为:

#pragma omp critical
{
    snprintf(seq, region_length, "%s", gene_seq + init_pos);
}

它仍然无法执行。 gdb 为变量提供了以下值:

(gdb) p strlen(gene_seq)
$1 = 1405
(gdb) p init_pos
$2 = 683
(gdb) p region_length
$4 = 221   

当我单线程执行程序时,它运行良好,而 gdb 不是很有帮助。我的 glibc 版本是 2.15。如果需要,将提供更多信息。

最佳答案

您是否错过了 safe_malloc() 原型(prototype)并且是在 64 位上?

如果"is",编译器假定 safe_alloc() 返回 32 位,因此如果指针的值大于 2^32,则返回一个无效指针。

打开所有警告 -Wall -Wextra -pedantic 并听听编译器告诉你什么。

关于c - 使用 OpenMP 时 snprintf 中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25748097/

相关文章:

c - 如何使我的代码符合 MISRA 2012 规则 2.1

C UDP套接字: Arbitrary setsockopt behavior (with SO_RCVTIMEO)

c 打印包含结构的树

ruby - 在类变量、rake 任务和 cron 上使用互斥锁的 Rails

Java ThreadLocal 静态?

c++ - OpenMP 矩阵乘法嵌套循环

c - OPenMP:何时可以并行化循环

c - 内置函数 'printf"的不兼容隐式声明

c# - 跨线程操作无效 : Control 'textBox1' accessed from a thread other than the thread it was created on

c++ - OpenMP 如何在归约子句中使用原子指令?