MPI_Send到在同一进程上运行的多个POSIX线程

时间:2015-06-23 11:07:43

标签: c++ multithreading pthreads mpi

我在进程#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);

    ...
}

1 个答案:

答案 0 :(得分:1)

我不熟悉MPI,但你似乎在这里分配了错误的空间:

threads = (pthread_t *) malloc(nthreads*sizeof(threads));

由于这个原因,您的代码很可能会出现段错误。

如果threadspthread_t *,您希望分配nthreads*sizeof(*threads) - 足够的空间来容纳nthreads的{​​{1}}个实例。

另外,you shouldn't cast the result of malloc