有人可以解释这段代码的执行顺序吗?
在尝试理解代码流如何工作时,我被困在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");
}
答案 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");
}