我尝试从教程中编译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
传递给我不喜欢的线程。
答案 0 :(得分:1)
这是因为你将相同的指针传递给所有线程。变量i
的地址在pthread_create
次调用之间不会发生变化。
有几种方法可以解决这个问题:第一种方法是在堆上分配空间(通过例如new
或malloc
),并将该指针传递给线程函数。另一个函数,我真的不建议,因为它取决于编译器的特定于实现的行为,是将实际值作为指针传递(例如(void *) i
)。
我 推荐的解决方案是使用std::thread
而不是POSIX线程函数。
答案 1 :(得分:0)
尝试在没有睡眠线的情况下运行相同的代码。在我看来,在线工具出了点问题。