动态创建线程并传递整数

时间:2012-06-05 20:41:26

标签: c multithreading unix pthreads

我有一个进程,它根据传递给进程的参数创建了许多线程。

producer_threads[num_threads];
for (id = 0; id < num_threads; id++)
{
    printf("%d\n", id);
    pthread_create(&producer_threads[id], NULL, &produce, (void *) &id);
}

每个线程进入一个产生函数并将id存储为局部变量

void* produce (void* args)
{
    int my_id = * (int*) args;
    printf("Thread %d started to produce\n", my_id);
}

但是我收到的输出如图所示

0
1
Thread <n> started to produce
Thread <n> started to produce

和n是随机的0,1或2.我不确定是什么导致问题,除非是因为全局变量在本地分配之前正在更新。或者因为“局部变量”在线程之间共享。

2 个答案:

答案 0 :(得分:3)

问题在于您将指向相同变量的指针传递给每个线程。这会创建一个竞争条件,每个线程看到的变量值取决于确切的时间。

如果您要通过值而不是通过指针传递线程参数,这将解决问题。

答案 1 :(得分:2)

整数需要是一个alloc'd变量而不是堆栈变量。由于您将指针传递到堆栈上的内存位置,因此结果将取决于时间(即竞争条件)。您需要将不同的变量传递给每个pthread_create调用。