c++ - 无法理解线程示例的输出

标签 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

为什么上面写了多次“creating thread, x”?循环本来应该运行一次,对吗? 附言。当我运行这个 code 时在同一个编译器上,没有任何输出。 附页。我稍微改变了示例,示例直接将 (void *)i 传递给我不喜欢的线程。

最佳答案

这是因为您将同一个指针传递给所有线程。变量 i 的地址在 pthread_create 调用之间不会改变。

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

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

关于c++ - 无法理解线程示例的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26801879/

相关文章:

c++ - 误解全局运算符重载规则

c++ - 用于数据存储和分析的库

c++ - G++ 命令抛出 "expected ' (' for function-style cast or type construction"

c++ - 找不到 Protocol Buffer 生成命令 libprotobuf.dll.a

c++ - 在类的定义中定义成员函数

c++ - Qt 中的 Objective-C with Mavericks

c++ - 离散傅立叶变换 C++

c# - 如何编写我的 C++ 函数以便我可以从 C# 调用它?

c++ - 从文件中读取数据对

c++ - Makefile:无法获得与 patsubst 一起使用的基名