我必须使用线程来解决给定的问题,我唯一需要做的就是以某种方式使我的线程使用一个名为launchR的函数,我使用无线程测试我的函数并运行正常,但每当我尝试搞乱时线程我得到分段错误,我找不到原因。 这就是我处理线程的方式:
pthread_t threads[n];
int rc, t;
int *tid[n];
int bpt = b/n,
macc = b%n,
adv = 0;
for (t=0; t < n; t++) {
tid[t] = (int *)malloc(sizeof(int));
*tid[t] = t;
printf("Creando el Hilo %d\n",t);
if (macc == 0 ) {
rc = pthread_create(&threads[t],NULL,launchR(objarr,bombs,adv,obj,bpt), (void *)tid[t]);
printf("\n Cree el Hilo THID: %d \n",*(tid[t]));
if (rc) {
printf("Error, %d\n",rc);
exit(-1);
}
adv=adv+bpt;
}
else if (macc > 0 ) {
rc = pthread_create(&threads[t],NULL,launchR(objarr,bombs,adv,obj,bpt+1), (void *)tid[t]);
printf("\n Cree el Hilo THID: %d \n",*(tid[t]));
if (rc) {
printf("Error, %d\n",rc);
exit(-1);
}
adv=adv+bpt+1;
printf("%d\n", adv);
}
macc--;
}
for (t=0; t < n; t++) {
pthread_join(threads[t],NULL);
}
我很感激你能给我的任何建议。
编辑:这是函数启动的代码,它基于另一个函数。
void launch ( int obj[][5] , int bombs[][4] , int bomb, int objs ) {
for (int i = 0; i < objs; ++i) {
if ( obj[i][0] <= (bombs[bomb][0] + bombs[bomb][2]) &&
obj[i][0] >= (bombs[bomb][0] - bombs[bomb][2]) &&
obj[i][1] <= (bombs[bomb][1] + bombs[bomb][2]) &&
obj[i][1] >= (bombs[bomb][1] - bombs[bomb][2])){
if (obj[i][3] == 1) {
obj[i][2] = obj[i][2] - bombs[bomb][2];
obj[i][4] = 1;
}
else if (obj[i][3] == -1){
obj[i][2] = obj[i][2] + bombs[bomb][2];
obj[i][4] = 1;
}
}
}
}
void *launchR(int obj[][5] , int bombs[][4] , int ibomb, int objs, int cant){
for (int i = ibomb; i <= cant; i++) {
launch(obj,bombs,i,objs);
}
}
编辑2:这是我的输出:
entro en threads
Creando el Hilo 0
Cree el Hilo THID: 0
2
Creando el Hilo 1
[1] 19677 segmentation fault ./batalla -t -n 3 prueba
答案 0 :(得分:0)
函数声明是 void launch(int obj [] [5],int bombs [] [4],int bomb,int objs); 因此,pthread_create调用中的参数应该是函数启动的地址。 pthread_create应该是:
pthread_create(&threads[t],NULL,(void *)&launchR(objarr,bombs,adv,obj,bpt+1), (void *)tid[t]);