gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:35:50 24 4
gpt4 key购买 nike

我尝试编译 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com