0

我的线程例程看起来像这样

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. 这个线程安全吗?
  2. 哪个线程拥有内存?
  3. ptr每次新线程dowork处理? 如果是,那么之前分配的内存会怎样?
  4. 如果delete[] ptr在末尾使用dowork怎么办?
4

2 回答 2

3
  1. ptr 是本地指针,因此只要您不将指针传递给另一个线程,其他线程就不会干扰它。

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

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

  4. delete[]使用yes会很好。

为了解释它ptr是由操作系统分配的,每次调用 new 都会从操作系统分配一个新的指针。ie 指向的值ptr是一个本地堆栈变量,因此是线程本地的,只要不进行通信,就没有其他线程可以获取它的值。

于 2013-05-21T06:15:17.193 回答
1

好的,这里有一些您可能会觉得有用的提示。

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

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

2)“哪个线程拥有内存”这些问题对我来说有点模棱两可-您是在谈论为线程执行提供的虚拟内存还是“new char []”构造?

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

4)您必须在函数末尾使用delete[] ptr。如果调用超过 1000 次,可能会导致严重的错误,例如“无法分配内存”

希望这会有所帮助。干杯,康斯坦丁

于 2013-05-21T06:14:33.043 回答