如果指针是在主线程中使用 malloc() 创建的,您如何在辅助线程中释放 () 缓冲区指针?

How do you free() a buffer pointer in a secondary thread, if the pointer was created with malloc() in the main thread?

我正在尝试实施一个部分基于以下讨论的解决方案。基本上,我想在主线程中 malloc() 并在辅助线程中 free() 。链接的讨论涉及 LabWindows,但我认为我的问题更针对一般的 C 程序员。

LabWindows: implementing thread safe queues that can handle string elements

How to use a thread safe queue to store strings

我在主线程中创建了一个指向 char 的指针,并使用 malloc() 分配了存储空间。我将一些数据复制到存储中,并将指针分配给一个数组元素(CmtWriteTSQData 需要一个数组)。该数组被传递到线程安全队列。

在辅助线程中,读取线程安全队列。数据被分配到一个新数组。

如何释放在辅助线程中分配的内存,因为指针变量不再在范围内?

我可以只对数组元素调用 free() 吗?或者我是否需要在辅助线程中创建另一个指向 char 的指针,将数组元素复制到它,然后在指针上调用 free()

free() 似乎没有 return 值,所以我不知道如何确保调用成功。

// Main thread
char *ptr = NULL;
char *array1[1] = {0};

ptr = (char *) malloc (3 * sizeof (char));

strcpy (ptr, "hi");

array1[0] = ptr;

CmtWriteTSQData (queue, array1, 1, 0 NULL);    

// Secondary thread
char *array2[1] = {0};

CmtReadTSQData (queue, array2, 1, 0, 0);

printf ("%s", array2[0]);  // Prints "hi"

free (array2[0]);  // Does this work?

简短的回答是肯定的。

当您调用 malloc() 时,您要求操作系统为您提供一些最小大小的可用内存块,操作系统通过传递给您一个指针来响应,该指针只是一个整数,表示该内存块的虚拟地址。

当一个程序有多个线程时,这意味着几个轻量级进程共享同一个虚拟地址space,这意味着如果同一个进程的多个线程之间存在一些有效指针的多个副本,那么它们必须都指向相同的内存位置。

操作系统不关心哪个线程申请内存,也不关心哪个线程还给它。当 malloc() returns 进程中的指针时,该进程中的所有线程都可以使用它,并且当其中一个线程 free() 使用该指针时,该内存位置对所有线程都无效进程中的线程。

我不知道函数 CmtWriteTSQData()CmtReadTSQData() 的行为如何,但只要 printf("%p\n",ptr)mainprintf("%p\n",array2[0]) 中线程产生相同的十六进制值,你的代码很好。

希望对您有所帮助!