C线程(pthread_create)无法按预期工作

时间:2014-03-17 02:02:41

标签: c multithreading pthreads pthread-join

我想创建多个线程(下例中为10个)并让每个线程都运行一个函数。

这是我的代码:

#include <stdio.h>
#include <pthread.h>

typedef struct arg_struct {
    int id;
    int val;
} arg_struct;

void *printarg(void *params) {
    arg_struct *args = (arg_struct *) params;
    printf("id %i value %i\n", args->id, args->val);
    return 0;
}

int main() {
    int i = 0;
    pthread_t threads[10];
    for (i = 0; i < 10; i++) {
        arg_struct arg;
        arg.id = i;
        arg.val = i + 10;
        pthread_create(&(threads[i]), NULL, &printarg, &arg);
    }
    for (i = 0; i < 10; i++) {
        pthread_join(threads[i], NULL);
    }
    return 0;
}

我在执行期间期待这样的输出:

id 0 value 10
id 1 value 11
id 2 value 12
id 3 value 13
id 4 value 14
id 5 value 15
id 6 value 16
id 7 value 17
id 8 value 18
id 9 value 19

但我得到这样的输出:

id 2 value 12
id 3 value 13
id 3 value 13
id 4 value 14
id 6 value 16
id 6 value 16
id 9 value 19
id 9 value 19
id 9 value 19
id 9 value 19

每次重新运行程序时,输出都会略有变化。 id&amp; s&amp;价值重复,模式似乎不规则。

发生了什么事?重复是否发生,因为子线程也在for循环中创建线程?如果是这样,我很困惑,因为在我读过的pthread_create的许多例子中,人们似乎正在使用一个迭代N次以创建N个线程的循环(就像上面一样)。因此我假设上面的代码将有1个主线程创建N个子线程?我错了吗?提前谢谢。

1 个答案:

答案 0 :(得分:7)

每个线程都传递一个指向循环内声明的arg_struct的指针,该指针在每次迭代时重新创建。如果在退出循环之前没有任何线程执行,则它们在技术上引用一个超出范围的变量。即使它没有超出范围(比如你在main的顶部声明它),它们都会看到你放在那里的最终值。从您的跟踪中可以看出,线程相对于循环以随机块开始。

您需要为每个线程分配一个单独的arg_struct,并确保每个线程在线程的生命周期内保持有效。

试试这个:

#define NUM_THREADS 10

int main() {
    int i = 0;
    pthread_t threads[NUM_THREADS];
    arg_struct args[NUM_THREADS];
    for (i = 0; i < NUM_THREADS; i++) {
        args[i].id = i;
        args[i].val = i + 10;
        pthread_create(&threads[i], NULL, &printarg, &args[i]);
    }
    for (i = 0; i < NUM_THREADS; i++) {
        pthread_join(threads[i], NULL);
    }
    return 0;
}