2 yueasdfghjkl Yueasdfghjkl 于 2015.06.04 09:12 提问

新手: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

搞不懂为什么。。。

8个回答

u012377333
u012377333   Rxr 2015.06.04 09:46
已采纳

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

LogicTeamLeader
LogicTeamLeader   2015.06.04 09:33

这样改:

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

改成

int i = t;
 rc = pthread_create(&thread[t], NULL, PrintHello, &i);
LogicTeamLeader
LogicTeamLeader   2015.06.04 09:35

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

 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;
    }
}
Yueasdfghjkl
Yueasdfghjkl 等所有线程都结束了,t就是8 了,所以打印出来都是8
2 年多之前 回复
Yueasdfghjkl
Yueasdfghjkl 我在想之前那样输出是不是因为:每个线程都是等到运行结束才打印结果,for( t = 0; t < NUM_THREADS; t++) pthread_join(thread[t], NULL);
2 年多之前 回复
Yueasdfghjkl
Yueasdfghjkl 我在想之前那样输出是不是因为:每个线程都是等到运行结束才打印结果,for( t = 0; t < NUM_THREADS; t++) pthread_join(thread[t], NULL);
2 年多之前 回复
u012377333
u012377333   Rxr 2015.06.04 09:39

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

u012221383
u012221383   2015.06.04 09:39

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

u012221383
u012221383   2015.06.04 09:39

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

datou431
datou431   Rxr 2015.06.18 10:47

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

datou431
datou431   Rxr 2015.06.18 10:48

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;
}
}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!