Yueasdfghjkl
奥利喵
采纳率100%
2015-06-04 01:12 阅读 2.8k
已采纳

新手: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 一枪尽骚丶魂 2015-06-04 01:46

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

    点赞 评论 复制链接分享
  • LogicTeamLeader LogicTeamLeader 2015-06-04 01: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 01: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;
        }
    }
    
    点赞 评论 复制链接分享
  • u012377333 一枪尽骚丶魂 2015-06-04 01:39

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

    点赞 评论 复制链接分享
  • u012221383 坏蛋你好 2015-06-04 01:39

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

    点赞 评论 复制链接分享
  • u012221383 坏蛋你好 2015-06-04 01:39

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

    点赞 评论 复制链接分享
  • datou431 请叫我头头哥 2015-06-18 02:47

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

    点赞 评论 复制链接分享
  • datou431 请叫我头头哥 2015-06-18 02: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;
    }
    }

    点赞 评论 复制链接分享

相关推荐