【发布时间】:2014-09-09 15:10:40
【问题描述】:
我在某处读到 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。如果需要,将提供更多信息。
【问题讨论】:
-
你读到了gene_seq的结尾吗?
-
我不认为
snprintf通常是线程安全的。也许您读过一个特定的实现是?当然,如果您记得在哪里看到的,那会有所帮助。 -
@PascalCuoq 这里的第一个答案:stackoverflow.com/questions/13386352/is-sprintf-thread-safe
-
也许您阅读
gene_seq来计算这些变量并出于其他原因写入它,使这些变量具有奇怪 值。 -
@alk 这个评论好像是一个答案
标签: c multithreading openmp