Valgrind在线程

时间:2015-10-18 15:57:00

标签: c multithreading sockets tcp valgrind

我无法确定为什么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连接作为“火车”的火车站。我正在尝试让程序使用线程以便侦听并尝试连接到其他站点(程序的其他实例)。

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

在我的测试工作中,文件是用。编译的 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将创建一个套接字并侦听尝试连接的时间。连接似乎是成功的,但由于某种原因,我也无法刷新连接以发送任何东西,我感觉可能是因为Valgrind告诉我的。 令人奇怪的是,当为tom的实例上的连接创建一个线程时,尽管有一个非常类似的创建线程的过程(在参数指针中传递相同的参数并且进行相同的赋值),但不会抛出valgrind中的错误。

对于蒂姆的结局可能是误报,还是我在这里做了一些严重的错误?

2 个答案:

答案 0 :(得分:2)

internal数据结构的值追溯到它来自的位置,您将看到它来自未初始化的struct对象。您稍后将值分配给某些字段,但不是全部分配。

始终初始化struct个对象,同时注意您有一个约定,明确默认初始化(就像使用0完成)对于类型。

如果,有一天,您确实遇到了性能瓶颈,因为您的编译器没有优化未使用的初始化,再次考虑它并以不同方式执行。在这里,因为您正在启动线程并执行其他复杂的操作,所以差异永远无法衡量。

答案 1 :(得分:1)

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

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()的末尾)。