#include <pthread.h>
#include <stdio.h>
void* printHello (void* threadId)
{
pthread_t *my_tid = (pthread_t *)threadId;
printf ("\nIn `printHello ()`: thread id %ld", (long)*my_tid);
pthread_exit (NULL);
}
int main ()
{
pthread_t arrayOfThreadId [5];
int returnValue;
unsigned int iterate;
for (iterate = 0; iterate < 5; iterate++)
{
if (returnValue = pthread_create (&arrayOfThreadId [iterate],
NULL,
printHello,
(void*) &arrayOfThreadId [iterate]) != 0)
{
printf ("\nerror: pthread_create failed with error number %d", returnValue);
}
else
{
printf ("\nIn `main()`: creating thread %ld", arrayOfThreadId [iterate]);
}
}
printf ("\nBefore `return 0;` in `main()`");
pthread_exit (NULL);
return 0;
}
输出:
In
`main()`: creating thread 139683073914640
In `main()`: creating thread 139683065521936
In `main()`: creating thread 139683057129232
In `main()`: creating thread 139683048736528
In `main()`: creating thread 139683040343824
Before `return 0;` in `main()`
In `printHello ()`: thread id 140735115959408
In `printHello ()`: thread id 4195680
In `printHello ()`: thread id 0
In `printHello ()`: thread id 0
In `printHello ()`: thread id 139683073914640
为什么线程 ID 不同?
我在这里遗漏了一些要点。看来我不小心做错了。
最佳答案
您正在传递 threadId 的地址,但将该地址转换为 pthread_t,从而将 arrayOfThreadId 中的元素地址视为 pthread_t。
这样做:
void* printHello (void* threadId)
{
pthread_t *my_tid = threadId;
printf ("\nIn `printHello ()`: thread id %ld\n", (long)*my_tid);
并确保您的 main() 在所有线程完成之前不会退出,否则您将面临在线程插入数组之前数组被破坏的风险。
关于c - main() 和 start_routine() 中的线程 ID 不同 - Pthread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9207828/