线程和动态内存
Pthreads and dynamic memory
我的线程例程是这样的
void * dowork(void * args)
{
char* ptr = new char[25];
memset(ptr, 0, sizeof(ptr));
// Do some operations with ptr
// What if I call delete[] ptr
}
我初始化了5个线程。现在是问题,
- 这个线程安全吗?哪个线程拥有内存?
- 每次有新线程处理
dowork
时,ptr
会重新初始化吗?如果是,那么之前分配的内存会发生什么? - 如果
delete[] ptr
在dowork
的末端使用会怎样
-
ptr是本地指针,所以没有其他线程会干扰它,只要你不把指针传递给另一个线程。
-
运行此函数的两个线程将各分配1个char[25]数组。但是线程不是所有者,而是拥有它的进程。
-
ptr
将重新初始化,并且在线程连接时不会删除旧内存。因此,如果不使用delete,它将泄漏内存。 -
delete[]
将很好地使用yes。
说明ptr
是由操作系统分配的,每次调用new都会从操作系统分配一个新的指针。ptr
的值(即它所指向的位置)是一个本地堆栈变量,因此对于线程来说是本地的,只要没有通信,其他线程就无法获得它的值。
好了,下面是一些你可能会觉得有用的技巧。
1) 线程安全是一个适用于多线程程序的计算机编程概念。如果一段代码仅以保证多个线程同时安全执行的方式操作共享数据结构,那么它就是线程安全的。(c) Wiki
换句话说,如果这个线程不会导致死锁或弄乱共享数据,那么它就是安全的。在您提供的代码段中,没有使用共享数据。
2)"哪个线程拥有内存"这个问题对我来说有点模棱两可——你是在谈论为线程执行提供的虚拟内存还是"新char[]"结构?
当你调用pthread_create()(假设语法)时,你发送了指针到函数,但是局部变量的概念仍然适用。换句话说,任何局部变量都是在创建新线程的过程中重新定义的。下一部分:每次调用pthread_create()时,它都会创建一个实例,该实例将伪独立地运行线程,将其视为多次调用相同的函数。如果第一个实例已经完成了一半,而第二个实例刚刚开始,它们的局部变量彼此不相关,这不是问题。你必须担心共享数据。4)你必须使用delete[] ptr在你的函数结束。如果调用超过1000次,可能会导致严重的bug,比如"can't allocate memory"
希望这是有帮助的。欢呼,康斯坦丁
相关文章:
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 对具有动态分配的内存和析构函数的类对象的引用
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 调用析构函数以释放动态分配的内存
- 为什么类和 main() 函数中也有动态内存分配
- 将静态内存更改为动态C++
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- 在运行时为动态分配的内存输入值
- c++ 动态内存 堆栈中的分配
- 释放动态分配的内存时是否需要执行此额外步骤
- 动态分配字符数组的内存
- 销毁C++中动态分配的内存(数组对象)
- 给定特定内存地址的数组的动态内存分配
- 释放动态内存时C++错误
- 对内存动态分配的类不使用"*"的逻辑
- 如果我将内存动态分配给静态变量,我应该释放它还是会自动释放它
- 给定内存地址的内存动态初始化
- 删除指针分配的内存(动态数组)