我使用BSPlib并在添加" int i"的简单定义时关于在多个线程上运行的函数(以及许多其他线程),我收到类似&#34的消息;进程2捕获了SIGNAL 11 Segmantation fault"。重要的是要注意我检查了很多,没有它我没有得到分段错误,并且我几乎一直都得到它。 int定义怎么可能导致它?我可能造成了堆栈溢出吗? 感谢。
int P;
int main( int argc, char* argv[] )
{
/** sequentail - process 0 */
P=bsp_nprocs(); /// maximum number of process avialble (must do that on sequential part ,need for bsp begin)
bsp_begin(P);
char* str1;
char* str2;
int n;
int** table;
int thread=bsp_pid();
int num_threads=bsp_nprocs();
if(thread == 0)
{
ifstream file1(argv[1]);
ifstream file2(argv[2]);
// check if the strings are the same size RDBG
string string1((istreambuf_iterator<char>(file1)), istreambuf_iterator<char>());
string string2((istreambuf_iterator<char>(file2)), istreambuf_iterator<char>());
n=string1.length();
str1= (char*)malloc(sizeof(char)*(n+1));
str2= (char*)malloc(sizeof(char)*(n+1));
strcpy(str1,string1.c_str());
strcpy(str2,string2.c_str());
}
if (thread!=0)
{
str1= (char*)malloc(sizeof(char)*(n+1));
str2= (char*)malloc(sizeof(char)*(n+1));
}
bsp_push_reg(&n,SZINT);
bsp_sync();
bsp_get(0,&n,0,&n,SZINT);
bsp_sync();
if (thread==0)
{
table=(int**)malloc(sizeof(int)*(n+1));
for (int i=0; i<n+1; i++)
table[i]=(int*)malloc(sizeof(int)*(n+1));
}
bsp_push_reg(str1,SZCHAR*(n+1));
bsp_push_reg(str2,SZCHAR*(n+1));
bsp_push_reg(table,n*n*SZINT);
bsp_sync();
if (thread==0)
{
for(int t=1; t<num_threads; t++)
for (int k=0; k<=n; k++)
{
bsp_put(t,str1+k,str1,k*SZCHAR,SZCHAR);
bsp_put(t,str2+k,str2,k*SZCHAR,SZCHAR);
}
}
bsp_sync();
cout << thread << "!!!" << str1 << ";" << str2 << endl;
int i;
bsp_sync();
bsp_pop_reg(table);
bsp_pop_reg(str2);
bsp_pop_reg(str1);
bsp_pop_reg(&n);
bsp_sync();
free(str1);
free(str2);
bsp_sync();
bsp_end();
return 0;
}
答案 0 :(得分:2)
表变量的声明/初始化不正确。您正在将其初始化为数组数组(即作为n + 1个不同的内存块),而您告诉bsplib它是一个n * n整数的连续内存块。您需要更改分配或注册。
因此,bsplib会覆盖根本没有初始化的内存。
答案 1 :(得分:1)
在绝大多数情况下,一个无缝的变化导致或解决问题,你就拥有了所谓的海森病。在这种情况下,实际变化不是根本原因,变化只是导致真正的错误浮出水面的催化剂。
我不完全确定BSPlib如何处理它的线程,但在我看来,n
值并未针对thread
非零的情况进行初始化。
换句话说,该值仅设置为string1
thread == 0
的长度,但它用于malloc
的{{1}}空间,表示空间依赖于无论垃圾堆放在堆栈上。
答案 2 :(得分:0)
string string1((istreambuf_iterator<char>(file1)), istreambuf_iterator<char>());
string string2((istreambuf_iterator<char>(file2)), istreambuf_iterator<char>());
n=string1.length();
str1= (char*)malloc(sizeof(char)*(n+1));
str2= (char*)malloc(sizeof(char)*(n+1));
strcpy(str1,string1.c_str());
strcpy(str2,string2.c_str());
当string2比string1长时会发生什么?这是不是这样的?您正在使用malloc
在string1
中分配str2
的大小。如果string2
长于string1
,您将缓冲溢出,可能会破坏内存中的各种内容。
你应该做n1 = string1.length(); n2 = string2.length();
吗?