多个C ++线程如何在类方法上执行

时间:2008-09-27 15:42:29

标签: c++ multithreading

假设我们有一个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”,或者每个进入线程都会在for循环中修改i,导致i一直在奇怪地改变。

4 个答案:

答案 0 :(得分:15)

在堆栈上分配了

i。由于每个线程都有自己独立的堆栈,因此每个线程都有自己的i

副本

答案 1 :(得分:4)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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