【问题标题】:How does Multiple C++ Threads execute on a class method多个 C++ 线程如何在类方法上执行
【发布时间】:2010-09-13 17:14:03
【问题描述】:

假设我们有一个像这样的 c++ 类:

class MyClass
{
   void processArray( <an array of 255 integers> )
   {
     int i ;
     for (i=0;i<255;i++)
     {
        // do something with values in the array
     }
   }
}

以及该类的一个实例,例如:

MyClass myInstance ;

和 2 个调用该实例的 processArray 方法的线程(取决于系统如何执行线程,可能以完全不规则的顺序)。该范围内没有使用互斥锁,因此两个线程都可以进入。

我的问题是 i 发生了什么?每个线程范围是否都有自己的“i”,或者每个进入的线程会在 for 循环中修改 i,导致 i 一直在奇怪地变化。

【问题讨论】:

    标签: c++ multithreading


    【解决方案1】:

    i 在堆栈上分配。由于每个线程都有自己独立的堆栈,因此每个线程都有自己的i 副本。

    【讨论】:

    • 从技术上讲,它可能会在寄存器中,但想法就在那里。
    • 从技术上讲,它被称为堆栈变量(因为它的作用域)。寄存器只是一个不相关的实现细节。
    【解决方案2】:

    小心。在提供的示例中,方法 processArray 似乎是 reentrant(不清楚在 // 对数组中的值进行操作 中发生了什么)。如果是这样,当两个或多个线程同时调用它时不会发生竞争,因此在没有任何锁定机制的情况下调用它是安全的。 要强制执行此操作,您可以使用 volatile 限定符标记实例和方法,让用户知道不需要锁定。 Andrei Alexandrescu 发表了一篇关于 volatile 限定符 以及如何使用它来编写正确的多线程类的有趣文章。文章发表在这里: http://www.ddj.com/cpp/184403766

    【讨论】:

      【解决方案3】:

      由于 i 是一个局部变量,它存储在线程自己的私有堆栈中。因此,您不需要使用关键部分来保护 i。

      【讨论】:

        【解决方案4】:

        正如亚当所说,i 是一个存储在堆栈中的变量,并且参数被传入,所以这是安全的。当您必须小心并应用互斥锁或其他同步机制时,如果您正在访问同一类实例中的共享成员变量或程序中的全局变量(甚至是作用域静态)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-21
          • 1970-01-01
          相关资源
          最近更新 更多