多个线程一起打印值

时间:2017-05-10 11:55:19

标签: c multithreading thread-safety pthreads

我试图理解为什么我在线程中运行此代码时得到了这个答案。 我不明白为什么每次都不会让我有所不同。 enter image description here

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 5

void *printHello(void *threadid)
{
    int tid = *(int*)threadid;  

    printf("Hello World! It's me, thread #%d!\n", tid);

    pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
    pthread_t threads[NUM_THREADS];
    int rc;
    int i;

    for (i = 0; i < NUM_THREADS; i++)
    {
        printf("In main: creating thread %ld\n", i,);

        rc = pthread_create(&threads[i], NULL, printHello, &i);

        if (rc)
        {
            printf("ERROR; return code from pthread_create() is %d\n", rc);
            exit(-1);
        }
    }

    pthread_exit(NULL); 
}

让所有线程等到他们完成创建它们然后再去printHello函数?

1 个答案:

答案 0 :(得分:1)

创建新线程时,没有固定的线程执行顺序。主线程和新创建的线程将简单地相互并行运行。

i变量相关的问题是您将i地址传递给pthread_create函数。由于此变量在后续循环迭代时会更新,因此当您通过其地址(来自printHello回调函数)访问它时,其值将会更改。在您的输出中,我们可以看到main函数中的循环在任何生成的线程输出任何内容之前已经完成,因为i已经达到NUM_THREADS限制。

如果您希望事物具有确定性,那么创建一个新变量来保存线程ID,并传入该线程的地址位置:

int threadIds[NUM_THREADS];
int rc;
int i;

for (i = 0; i < NUM_THREADS; i++)
{
    threadIds[i] = i;
    rc = pthread_create(&threads[i], NULL, printHello, threadIds + i);
}

此外,阻塞主线程,直到所有生成的线程完成执行,并且不在pthread_exit函数中调用main。它不是在pthread内运行,所以它不需要退出。