我在进程#0上启动n个POSIX线程来侦听来自进程#0 ... #n的传入调用。但是,我的代码不起作用,而是我得到了段错误。我认为问题可能是因为缓冲区重叠。我是C ++的新手。你能建议一个解决方案吗?
void *listener(void *arg) {
...
int status_switch;
while (true) {
MPI_Recv(&status_switch, 1, MPI_INT, fd->id, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
...
}
}
int main(int argc, char * argv[])
{
MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
if (world_rank == root)
{
int nthreads = world_size;
threads=(pthread_t *)malloc(nthreads*sizeof(threads));
fd=(struct_t *)malloc(sizeof(struct_t)*nthreads);
//Start listeners for each node on node0
for (int i = 0; i < world_size; i++) {
fd[i].id=i;
pthread_create(&threads[i], NULL, listener, (void *)(fd+i) );
}
}
int status_switch;
status_switch = 0;
MPI_Send(&status_switch, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
...
}
答案 0 :(得分:1)
我不熟悉MPI,但你似乎在这里分配了错误的空间:
threads = (pthread_t *) malloc(nthreads*sizeof(threads));
由于这个原因,您的代码很可能会出现段错误。
如果threads
是pthread_t *
,您希望分配nthreads*sizeof(*threads)
- 足够的空间来容纳nthreads
的{{1}}个实例。