【问题标题】:Thread Id differs in main() and start_routine() - Pthreadmain() 和 start_routine() 中的线程 ID 不同 - Pthread
【发布时间】:2012-02-09 08:57:39
【问题描述】:
#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 不同?

我在这里遗漏了一些要点。好像是我不小心做错了。

【问题讨论】:

    标签: c pointers pthreads


    【解决方案1】:

    您传递的是 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() 在所有线程完成之前不会退出,否则您可能会在线程进入之前破坏数组。

    【讨论】:

    • pthread_t *my_tid = threadId;results inerror: invalid conversion from ‘void*’ to ‘pthread_t*’
    • @Anisha Kaul,在 C 中,您不需要强制转换 void*,即 (pthread_t *)threadId 中的强制转换;不需要。如果您遇到您提到的错误,您正在将代码编译为 C++,而不是 C。您仍然需要确保 main() 在线程退出之前不会退出。如果问题仍然存在,则说明您的代码存在其他问题。
    • gcc 将以 .cpp 结尾的文件编译为 C++。
    • @Anisha:gccg++ 之间的区别(就 C/C++ 而言):stackoverflow.com/a/5854712/12711
    • @Anisha 是必须修复的代码问题。即使只是在睡觉(2);在 pthread_exit(NULL) 之前;在 main() 中可能会改变行为。 (如果 main() 退出,arrayOfThreadId 数组不再有效,因此您创建的线程可能会从中读取垃圾)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2018-06-04
    • 2015-02-16
    • 2011-07-24
    • 2015-09-20
    相关资源
    最近更新 更多