我尝试编译 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
调用之间不会改变。
有几种方法可以解决这个问题:第一种方法是在堆上分配空间(例如通过 new
或 malloc
),然后将该指针传递给线程函数。另一个函数,我真的不推荐,因为它取决于编译器的特定实现行为,是将实际值作为指针传递(例如 (void *) i
)。
我推荐的解决方案是使用std::thread
而不是 POSIX 线程函数。
关于c++ - 无法理解线程示例的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26801879/