线程自由指针

时间:2013-04-11 20:24:38

标签: c thread-safety pthreads free valgrind

我正在尝试使用C中的线程,而且我在释放指针时遇到了一些问题 如果这是线程函数

void *executor_func(void *param) {
char *lineEx = (char *) malloc (1024);

size_t lenEx = 1024;
ssize_t readEx;

FILE * fpEx;
char* pchEx;

fpEx = fopen(file, "r");

if (fpEx == NULL) {
    printf("ERROR: couldnt open file\n");
    exit(0);
}

while ((readEx = getline(&lineEx, &lenEx, fpEx)) != -1) {
    pchEx = strtok(lineEx, " ");

        //DO MY STUFF WITH THE LINE I RECEIVE FROM FILE
    }
free(lineEx);
fclose(fpEx);

return NULL;

 }

想象一下,我执行executor_func()的多个线程...... 免费(lineEX)给我Valgrind的问题......为什么会这样?

1 个答案:

答案 0 :(得分:1)

这来自文档:http://man7.org/linux/man-pages/man3/strtok.3.html

  

strtok()函数将字符串解析为一系列标记。上   该          首先调用strtok(),要在str中指定要解析的字符串。          在应该解析相同字符串的每个后续调用中,str应该是          NULL。

正如strtok手册所说: 使用这些功能时要小心。如果您确实使用它们,请注意:

   * These functions modify their first argument.

   * These functions cannot be used on constant strings.

   * The identity of the delimiting byte is lost.

   * The strtok() function uses a static buffer while parsing, so it's not
     thread safe.  Use strtok_r() if this matters to you.

如果你得到非法的释放可能与此有关(from Valgrid manuals):如果你试图释放一个不指向堆块开头的指针,你也会收到这条消息.Memcheck保持不变跟踪您的程序使用malloc / new分配的块,因此它可以准确地知道free / delete的参数是否合法。在这里,这个测试程序已经释放了两次相同的块。与非法读/写错误一样,Memcheck尝试了解释放的地址。如果在这里,地址是之前被释放的地址,那么你将被告知 - 使同一块的重复释放容易被发现。

最后看看这个:strtok function thread safety 您可以尝试使用strtok_r()