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

问题描述 投票:0回答:1

我正试图实现一个解决方案,部分基于下面的讨论。基本上,我想 malloc() 在主线和 free() 在一个次要的主题中。 链接的讨论涉及LabWindows,但我认为我的问题更多是针对一般的C程序员。

LabWindows:实现可以处理字符串元素的线程安全队列。

如何使用线程安全队列来存储字符串?

我在主线程中创建一个指向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?
c multithreading pointers malloc free
1个回答
2
投票

简而言之,答案是肯定的。

当你在主线程中调用 malloc(),你要求操作系统给你一块最小尺寸的可用内存,操作系统的响应是给你传递一个指针,这个指针只是一个整数,代表这块内存的虚拟地址。

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

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

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

希望能帮到你

© www.soinside.com 2019 - 2024. All rights reserved.