新手:thread_create()线程创建和输出的问题

#include
#include
#include
#include

#define NUM_THREADS 8

void PrintHello(void *args)
{
int thread_arg;
sleep(1);
thread_arg = (int)(
((int*)args));
printf("Hello from thread %d\n", thread_arg);
return NULL;
}

int main(void)
{
int rc,t;
pthread_t thread[NUM_THREADS];

for( t = 0; t < NUM_THREADS; t++)
{
    printf("Creating thread %d\n", t);
    rc = pthread_create(&thread[t], NULL, PrintHello, &t);
    if (rc)
    {
        printf("ERROR; return code is %d\n", rc);
        return EXIT_FAILURE;
    }
}
sleep(5);
for( t = 0; t < NUM_THREADS; t++)
    pthread_join(thread[t], NULL);
return EXIT_SUCCESS;

}

Creating thread 0
Creating thread 1
Creating thread 2
Creating thread 3
Creating thread 4
Creating thread 5
Creating thread 6
Creating thread 7
Hello from thread 8
Hello from thread 8
Hello from thread 8
Hello from thread 8
Hello from thread 8
Hello from thread 8
Hello from thread 8
Hello from thread 8

这个输出结果搞不明白,不是应该是下面这样吗
Creating thread 0
Creating thread 1
Creating thread 2
Creating thread 3
Creating thread 4
Creating thread 5
Creating thread 6
Creating thread 7
Hello from thread 0
Hello from thread 1
Hello from thread 2
Hello from thread 3
Hello from thread 4
Hello from thread 5
Hello from thread 6
Hello from thread 7

搞不懂为什么。。。

刚刚我自己本地测试了一下。
sleep(1);
thread_arg = (int)(((int*)args));
改为
int thread_arg = -1;
thread_arg = *(int *)arg;
sleep(1);
可以满足你的需求

这样改:

 rc = pthread_create(&thread[t], NULL, PrintHello, &t);

改成

int i = t;
 rc = pthread_create(&thread[t], NULL, PrintHello, &i);

想想还是不妥,这样改吧:

 for( t = 0; t < NUM_THREADS; t++)
{
    printf("Creating thread %d\n", t);
    rc = pthread_create(&thread[t], NULL, PrintHello, &t);
    if (rc)
    {
        printf("ERROR; return code is %d\n", rc);
        return EXIT_FAILURE;
    }
}

改成

int i[8];
 for( t = 0; t < NUM_THREADS; t++)
{
    printf("Creating thread %d\n", t);
        i[t]=t;
    rc = pthread_create(&thread[t], NULL, PrintHello, &i[t]);
    if (rc)
    {
        printf("ERROR; return code is %d\n", rc);
        return EXIT_FAILURE;
    }
}

你在线程里面一进去就睡眠了1秒,外面的循环早就结束了,传递进来的参数t,已经是8了,所以全部是8;
修改:
sleep(1);
thread_arg = (int)(((int*)args));
改为
thread_arg = (int)(((int*)args));
sleep(1);
先把传递的参数接受了,再去做想要做事情

线程的简历不是阻塞的,也就是说,你的循环跑完了,线程才创建出来,也就是说,你虽然在t=0的时候已经创建了线程,但是此时还会进行一些线程的准备,线程准备的时间要比你for的时间慢就出现了那样的情况,再就是t最好是值传递

线程的简历不是阻塞的,也就是说,你的循环跑完了,线程才创建出来,也就是说,你虽然在t=0的时候已经创建了线程,但是此时还会进行一些线程的准备,线程准备的时间要比你for的时间慢就出现了那样的情况,再就是t最好是值传递

sleep(1);
thread_arg = (int)(((int*)args));
改为
thread_arg = (int)(((int*)args));
sleep(1);

int i[8];
for( t = 0; t < NUM_THREADS; t++)
{
printf("Creating thread %d\n", t);
i[t]=t;
rc = pthread_create(&thread[t], NULL, PrintHello, &i[t]);
if (rc)
{
printf("ERROR; return code is %d\n", rc);
return EXIT_FAILURE;
}
}