无法理解线程示例的输出

时间:2014-11-07 13:03:59

标签: c++

我尝试从教程中编译following代码 使用online compiler。 这是代码:

#include <iostream>
#include <cstdlib>
#include <pthread.h>
#include <unistd.h>

using namespace std;

#define NUM_THREADS     5

void *PrintHello(void *threadid)
{
   long *tid;
   tid = (long*)threadid;
   cout << "Hello World! Thread ID, " << *tid << endl;
   pthread_exit(NULL);
}

int main ()
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long i;
   for( i=0; i < NUM_THREADS; i++ ){
      cout << "main() : creating thread, " << i << endl;
      rc = pthread_create(&threads[i], NULL, 
                          PrintHello, (void *)&i);
      if (rc){
         cout << "Error:unable to create thread," << rc << endl;
         exit(-1);
      }
   }

   sleep(1000000);
   pthread_exit(NULL);
}

这是输出:

main() : creating thread, 0
main() : creating thread, 1
main() : creating thread, 2
main() : creating thread, Hello World! Thread ID, 23

main() : creating thread, 4
Hello World! Thread ID, 4
Hello World! Thread ID, 4
Hello World! Thread ID, 4
Hello World! Thread ID, 5
main() : creating thread, 0
main() : creating thread, 1
Hello World! Thread ID, 1
main() : creating thread, 2
Hello World! Thread ID, 2
main() : creating thread, 3
Hello World! Thread ID, 3
main() : creating thread, 4
Hello World! Thread ID, 4
Hello World! Thread ID, 5
main() : creating thread, 0
main() : creating thread, 1
main() : creating thread, 2
Hello World! Thread ID, 2main() : creating thread, 3

main() : creating thread, 4
Hello World! Thread ID, 4
Hello World! Thread ID, 4
Hello World! Thread ID, 4
Hello World! Thread ID, 5

为什么“创建线程,x”多次写入?循环意味着运行一次吧? PS。此外,当我在同一个编译器上运行此code时,不会输出任何内容。 PPS。我略微更改了示例,示例直接将(void *)i传递给我不喜欢的线程。

2 个答案:

答案 0 :(得分:1)

这是因为你将相同的指针传递给所有线程。变量i的地址在pthread_create次调用之间不会发生变化。

有几种方法可以解决这个问题:第一种方法是在堆上分配空间(通过例如newmalloc),并将该指针传递给线程函数。另一个函数,我真的不建议,因为它取决于编译器的特定于实现的行为,是将实际值作为指针传递(例如(void *) i)。

推荐的解决方案是使用std::thread而不是POSIX线程函数。

答案 1 :(得分:0)

尝试在没有睡眠线的情况下运行相同的代码。在我看来,在线工具出了点问题。