pthread_join 和 pthread 奇怪的行为

pthread_join and pthread weird behaviour

我有 2 个进程,每个进程通过以下代码创建多个线程(本例中为 2 个)。当我将 pthread_join 放在 create 正下方时,它可以工作,但它总是按顺序调用线程。我想在不同的循环中进行连接,如下所示。问题是当我出于某种原因这样做时,它会创建相同线程的双倍而不是 2 个不同的线程。

所以当线程运行时它会打印类似 "线程 2.2 开始 线程 2.2 启动 线程 1.2 开始 线程 1.2 开始” 其中第一个数字是进程号,第二个数字是线程 no.They 应该是“1.2 1.1 2.1 2.2”。有人可以帮忙吗?

for(int i = 0; i<num_of_t;i++){
        struct threadst args;
        args.globalcp = globalcp;
        args.lock = lock;
        args.num1 = num1+i*((num2-num1+1)/num_of_t);
        args.num2 = args.num1+((num2-num1+1)/num_of_t)-1;
        args.threadid =i;
        args.pid = myOrder;
        pthread_create(&threads[i], &attr, findPrimes, (void *)&args);
        pthread_join(threads[i], &status);
    }

    //for(int i = 0; i<num_of_t;i++){
        //pthread_join(threads[i], &status);
    //}

首先,您在每个线程创建时传递相同的对象 (&args),因此它在所有线程之间共享。因此,根据需要给每个人自己的。

其次,不要在线程创建后立即调用pthread_join,否则您将重新引入顺序性(join 是等待线程结束的阻塞操作)。通常您需要启动您的线程,并在稍后的某个时间点对您需要等待的线程调用 join。

// create an array of args to be passed each for a given thread
struct threadst *args = malloc(sizeof(struct threadst)*num_of_t;
// need a test for malloc...

for(int i = 0; i<num_of_t;i++){
    struct threadst *arg = args+i;
    arg->globalcp = globalcp;
    arg->lock     = lock;
    arg->num1     = num1+i*((num2-num1+1)/num_of_t);
    arg->num2     = arg->num1+((num2-num1+1)/num_of_t)-1;
    arg->threadid = i;
    arg->pid      = myOrder;
    pthread_create(&threads[i], &attr, findPrimes, (void *)arg);
}

// do something else in the meantime

for (int i = 0; i<num_of_t;i++) {
    pthread_join(threads[i], &status);
}