代码的执行顺序

时间:2018-04-22 08:43:20

标签: c pthreads

sample output

有人可以解释这段代码的执行顺序吗?

在尝试理解代码流如何工作时,我被困在pthread_join部分:

#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS 25

int thread_routine (int x)
{
    printf ( "I'm Thread %2d my TID is %u\n", x, pthread_self () );
    pthread_exit(0);
}

int main ()
{
    pthread_attr_t thread_attr;
    pthread_t tids[NUM_THREADS];
    int x;
    pthread_attr_init (&thread_attr);

    for (x = 0; x < NUM_THREADS; x++)
    {
        pthread_create (&tids[x], &thread_attr, (void *)thread_routine, (void *) x);
    }

    printf ("Waiting for threads to finish\n");

    for (x = 0; x < NUM_THREADS; x++)
    {
        pthread_join (tids[x], NULL);
    }

    printf ("All treads are now finished\n");
}

1 个答案:

答案 0 :(得分:0)

我认为执行顺序没有问题。线程按顺序创建,自己执行,然后从头到尾加入它们。

通过一些修改,代码在我的机器上运行良好,一台运行Linux的旧x86 Thinkpad(Kubuntu 16.04 x86_64)。我用g ++ 11编译。

请注意,您需要注意pthread_create参数,并处理线程函数的输入。 x是一个整数,你作为参数获得的是一个指向void的指针,所以为了得到x,你需要首先将x:s地址发送到pthread_create,然后通过将void指针转换为int指针来检索它。检索int指针指向的int值。 Uff ...如果你在pthreads上使用thin std :: thread包装器会容易得多。

您也可以发送nullptr并跳过创建attr参数,因为您没有使用任何非默认的线程属性。

#include <pthread.h>
#include<stdio.h>
#define NUM_THREADS 25

int thread_routine (void* p)
{
    int x = *((int*)p);
    printf ( "I'm Thread %2d my TID is %u\n", x, (unsigned int)pthread_self () );
    pthread_exit(0);
}

int main () {
    pthread_attr_t thread_attr;
    pthread_t tids[NUM_THREADS];
    int x;
    int (*start_routine)(void*) = thread_routine;
    pthread_attr_init (&thread_attr);
    for (x = 0; x < NUM_THREADS; x++)
    {
        pthread_create(&tids[x], &thread_attr,
                       (void* (*)(void*))start_routine,
                        (void*) &x);
    }
    printf ("Waiting for threads to finish\n");
    for (x = 0; x < NUM_THREADS; x++)
    {
        pthread_join (tids[x], NULL);
    }
    printf ("All treads are now finished\n");
}