线程和动态内存

Pthreads and dynamic memory

本文关键字:内存 动态 线程      更新时间:2023-10-16

我的线程例程是这样的

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个线程。现在是问题,

    这个线程安全吗?哪个线程拥有内存?
  1. 每次有新线程处理dowork时,ptr会重新初始化吗?如果是,那么之前分配的内存会发生什么?
  2. 如果delete[] ptrdowork的末端使用会怎样
  1. ptr是本地指针,所以没有其他线程会干扰它,只要你不把指针传递给另一个线程。

  2. 运行此函数的两个线程将各分配1个char[25]数组。但是线程不是所有者,而是拥有它的进程。

  3. ptr将重新初始化,并且在线程连接时不会删除旧内存。因此,如果不使用delete,它将泄漏内存。

  4. delete[]将很好地使用yes。

说明ptr是由操作系统分配的,每次调用new都会从操作系统分配一个新的指针。ptr的值(即它所指向的位置)是一个本地堆栈变量,因此对于线程来说是本地的,只要没有通信,其他线程就无法获得它的值。

好了,下面是一些你可能会觉得有用的技巧。

1) 线程安全是一个适用于多线程程序的计算机编程概念。如果一段代码仅以保证多个线程同时安全执行的方式操作共享数据结构,那么它就是线程安全的。(c) Wiki

换句话说,如果这个线程不会导致死锁或弄乱共享数据,那么它就是安全的。在您提供的代码段中,没有使用共享数据。

2)"哪个线程拥有内存"这个问题对我来说有点模棱两可——你是在谈论为线程执行提供的虚拟内存还是"新char[]"结构?

当你调用pthread_create()(假设语法)时,你发送了指针到函数,但是局部变量的概念仍然适用。换句话说,任何局部变量都是在创建新线程的过程中重新定义的。下一部分:每次调用pthread_create()时,它都会创建一个实例,该实例将伪独立地运行线程,将其视为多次调用相同的函数。如果第一个实例已经完成了一半,而第二个实例刚刚开始,它们的局部变量彼此不相关,这不是问题。你必须担心共享数据。

4)你必须使用delete[] ptr在你的函数结束。如果调用超过1000次,可能会导致严重的bug,比如"can't allocate memory"

希望这是有帮助的。欢呼,康斯坦丁