1

我正在使用 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

4 回答 4

3

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

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

因此,如果您执行以下操作:

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

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

您需要初始化tinfo变量。显式使用memset或分配tinfo.thread_id = 0

于 2013-10-30T18:50:22.640 回答
3

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

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

struct thread_info tinfo = { 0 };
于 2013-10-30T18:53:09.403 回答
2

声明struct thread_info tinfo;全局,看看会发生什么。

于 2013-10-30T18:53:17.947 回答
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 上的整数类型(所以它们很可能是按顺序分配的,而你只是得到一个旧值)。

于 2013-10-30T20:04:14.160 回答