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

时间:2020-03-06 14:49:34  来源:igfitidea点击:

假设我们有一个类似的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一直在不断变化。

解决方案

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

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

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

当心。在提供的示例中,processArray方法似乎是可重入的(尚不清楚//对数组中的值执行操作会发生什么)。如果是这样,则在两个或者多个线程同时调用它时不会发生争用,因此无需任何锁定机制就可以安全地调用它。
要强制执行此操作,可以用volatile限定符标记实例和方法,以使用户知道不需要锁定。
它已经发表了Andrei Alexandrescu的一篇有趣的文章,内容涉及挥发性限定符以及如何使用它来编写正确的多线程类。该文章在这里发布:
http://www.ddj.com/cpp/184403766