c - main() 和 start_routine() 中的线程 ID 不同 - Pthread

标签 c pointers pthreads

#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/

相关文章:

C链表不能在开头添加元素

c++ - 为什么 *ptr++ 不改变指针对象的值,而 (*ptr)++ 改变指针对象的值?

C 编程指针——为什么我的值会改变?

c++ - ffmpeg(-mt) 和 TBB

c - 使用 free() 时内存使用量不会减少

c - 读取和打印文件时接收垃圾数据

c - 编写一个在 Windows 上提取 RPM 文件内容的程序

c - malloc 的问题

c - C 语言中的正则表达式使用函数 regcomp 和 regexec 在第一个和第二个匹配之间切换

c - 通过函数中的指针修改结构成员