pthread_t是为其定义的线程初始化的?

时间:2013-10-30 18:48:18

标签: c multithreading pthreads pid

我正在使用pthread_t打印出我在C中手动创建的线程的pid。但是,我在创建新线程之前打印它(通过ref作为参数传递它)并且它打印出一个不同的值(大概是我的主函数正在执行的线程)。我原以为它默认为0或者是单元化的。有任何想法吗? 谢谢,

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

struct thread_info {    /* Used as argument to thread_start() */
    pthread_t thread_id;/* ID returned by pthread_create() */
};

static void *thread_1_start(void *arg) {
    struct thread_info *myInfo = arg;
    printf("Started thread id: %d\n", myInfo->thread_id);
    pthread_exit(0);
}

int main() {
    struct thread_info tinfo;

    int s;
    printf("Main thread id: %d\n", tinfo.thread_id);
    s = pthread_create(&tinfo.thread_id,
        NULL, // was address of attr, error as this was not initialised.
        &thread_1_start,
        &tinfo);
    pthread_join(tinfo.thread_id,NULL);
}

实际输出:

Main thread id: 244580352
Started thread id: 245325824

预期产出:

Main thread id: // 0 or undefined
Started thread id: 245325824

4 个答案:

答案 0 :(得分:3)

问题是你没有初始化tinfo结构。

在局部变量中(与全局/堆变量相反),在C编程语言中 初始化值

所以,如果你做了类似的事情:

int c;
printf("%d", c);

你不应该期望一个连贯的值,因为它取决于那个时刻内存位置上的内容。

您需要初始化tinfo变量。使用memset或明确指定tinfo.thread_id = 0

答案 1 :(得分:3)

没有特定于线程的逻辑来初始化tinfo;它只是一个常规的C结构。它将在初始化时具有该内存地址中的任何数据。您需要明确初始化它。

您可以通过以下方式将值初始化为零:

struct thread_info tinfo = { 0 };

答案 2 :(得分:2)

宣布struct thread_info tinfo;全球,看看会发生什么。

答案 3 :(得分:0)

您需要了解许多重要事项。

首先,pthread_t是不透明的。你不能用printf可靠地打印它,因为在POSIX标准中没有任何地方将pthread_t指定为beinban into,struct或者其他。根据定义,您无法打印它并获得有意义的输出。

其次,如果一个线程需要知道它的pthread_t ID,它可以调用pthread_self()。您不需要告诉线程它的ID是外部的,就像您正在尝试的那样。

但别介意!您描述的打印输出接近您所期望的条件是因为您在线程打印输出和pthread_create之间的比赛将pthread_t分配给thread_info.thread_id,并且由于pthread_t实际上是Linux上的整数类型(所以它们很可能是按顺序分配的,而你只是得到一个旧值。