我正试图实现一个解决方案,部分基于下面的讨论。基本上,我想 malloc()
在主线和 free()
在一个次要的主题中。 链接的讨论涉及LabWindows,但我认为我的问题更多是针对一般的C程序员。
我在主线程中创建一个指向char的指针,并使用 malloc()
. 我将一些数据复制到存储中,并将指针赋给一个数组元素(CmtWriteTSQData
期待一个数组)。) 这个数组被传递到一个线程安全队列中。
在一个辅助线程中,线程安全队列被读取。 数据被分配到一个新的数组中。
由于指针变量不再在作用域内,我如何释放在辅助线程中分配的内存?
我可以直接调用 free()
上的数组元素? 还是我需要在辅助线程中创建另一个指向char的指针,将数组元素复制到它上面,然后调用 free()
的指针上?
在指针上没有出现一个返回值。free()
所以我不知道如何确保调用成功。
// 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()
,你要求操作系统给你一块最小尺寸的可用内存,操作系统的响应是给你传递一个指针,这个指针只是一个整数,代表这块内存的虚拟地址。
当一个程序有多个线程时,这就意味着几个轻量级进程共享同一个虚拟地址空间,这意味着如果同一个进程的几个线程之间有几个有效指针的副本,那么它们一定都指向同一个内存位置。
操作系统并不关心是哪个线程要的内存,也不关心哪个线程把内存还给它。当 malloc()
返回一个进程中的指针,该进程中的所有线程都可以使用它,当其中一个线程的 free()
的指针,该内存位置对进程中的所有线程都无效。
我不知道这些函数是如何 CmtWriteTSQData()
和 CmtReadTSQData()
乖巧,但只要 printf("%p\n",ptr)
在 main
和 printf("%p\n",array2[0])
在二级线程中产生相同的十六进制值,你的代码是好的。
希望能帮到你