多个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