Valgrind 在线程中抛出无法解释的错误

Valgrind throwing unexplainable error in thread

我无法确定 valgrind 抛出此错误的原因:

==82185== Thread 2:
==82185== Use of uninitialised value of size 8
==82185==    at 0x401B9A: proc_outconnection_thread (station.c:401)
==82185==    by 0x4E3CDF4: start_thread (in /usr/lib64/libpthread-2.17.so)
==82185==    by 0x51471AC: clone (in /usr/lib64/libc-2.17.so)
==82185==
the pass im sending is 'this'
==82185== Use of uninitialised value of size 8
==82185==    at 0x401BCA: proc_outconnection_thread (station.c:403)
==82185==    by 0x4E3CDF4: start_thread (in /usr/lib64/libpthread-2.17.so)
==82185==    by 0x51471AC: clone (in /usr/lib64/libc-2.17.so) 
==82185==

作为一些背景信息,我试图用 C 语言创建的程序模拟了一个使用 TCP 连接的火车站 "trains"。我试图让程序使用线程来监听和尝试连接到其他站点(程序的其他实例)。

当通过包含指向内部数据结构的指针的参数结构将内部数据结构传递给线程创建函数时,问题似乎存在。这样每个线程都有一个指向程序内部数据的指针。

在我的测试中,文件是用 gcc -pthread -g -o station station.c -Wall -pedantic -std=gnu99

为了产生我的错误,以 valgrind ./station tom authf logfile 3329 127.0.1.1 开始站的实例 然后用 valgrind ./station tim authf logfile 3328 127.0.1.1

开始另一个实例

由于 main 中的 if 语句,带有 tim 的站点名称将尝试连接到 tom,而 tom 将创建一个套接字并监听 tims 的连接尝试。连接似乎是成功的,但是由于某种原因我也无法刷新连接以在两者之间发送任何东西,我觉得这可能是因为 Valgrind 告诉我的。 奇怪的是,当为 tom 实例上的连接创建线程时,尽管创建线程的过程非常相似(相同的参数通过参数指针传递并进行相同的赋值),但 valgrind 中没有抛出任何错误.

这可能是蒂姆结局的误报,还是我在这里做错了什么?

跟踪您的 internal 数据结构的值回到它的来源,您会看到它源自一个未初始化的 struct 对象。您稍后会为某些字段分配值,但不会分配给所有字段。

总是 初始化 struct 对象,同时注意你有一个约定,明确了默认初始化是什么(就像用 0) 表示类型。

如果,有一天,你真的遇到了性能瓶颈,因为你的编译器没有优化一个不用的初始化,再想一想,换种方式去做。在这里,因为你正在启动线程并做其他复杂的事情,所以差异永远无法衡量。

您的问题是将局部变量上的指针传递给线程函数。最简单的解决方法是将此变量声明为静态或全局变量,但如果有多个线程使用该变量,这就不好了。 最好为结构分配所需的内存大小,初始化并将其传递给线程函数:

ArgStruct *argStruct = malloc(sizeof(ArgStruct));
if(argStruct == NULL) {
    fprintf(stderr, "Cant alloc memory!\n");
    exit(98);
}
argStruct->internalStruct = internal;
argStruct->clientCon = fdopen(fd, "r+");
pthread_create(&threadId, NULL, proc_outconnection_thread, (void *)argStruct);

此外,不要忘记释放此内存(例如在 proc_outconnection_thread() 末尾)。