C 无线程指针

C 无线程指针,c,thread-safety,pthreads,free,valgrind,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 o

我试图用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的问题。。。为什么会这样?

这是来自文档:

函数的作用是:将字符串解析为一系列标记。在…上 这个 对strtok()的第一次调用应该在str中指定要分析的字符串。 在每个应该解析相同字符串的后续调用中,str应该是 空

正如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.
如果获得非法释放,可能与此()有关:如果尝试释放不指向堆块开头的指针,也会收到此消息。Memcheck使用malloc/new跟踪程序分配的块,因此它可以准确地知道释放/删除的参数是否合法。在这里,这个测试程序两次释放了相同的块。和非法读/写错误一样,Memcheck尝试理解释放的地址。如果像这里一样,地址是以前被释放的地址,你会被告知——使同一块的重复释放容易被发现

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

您得到的具体错误是什么?但它只会给我错误消息invalid free,因为我正在运行同一个executor_func()的多个线程。。。可能是其中一个线程正在从另一个线程删除lineEx?可能吗?我如何修复它?当我想这样做时,我如何使用strtok\u r:char*pchE=strtok(NULL,“”???