静态函数和多线程中的C++静态成员
如何创建一个静态函数,其变量不需要在其中创建(对于计算问题),考虑到可以通过不同的线程调用该函数? 实施例:静态函数和多线程中的C++静态成员
class calcul {
static double **v1, **v2, ...,**vn;
public:
calcul();
~calcul();
static void matrix();
};
使得matrix()
使用v1
,...,vn
。
现在的问题是:当来自不同线程的calcul::matrix()
多次调用时,这是否会造成冲突,即与线程A相关的v1可以由线程B修改?
我使用'静态'的目标是符合人体工程学的,因为我不会每次都需要创建相应的对象。实际上Class'clacul'将是需要用于实时应用程序的库的一部分。这意味着calcul()可以每毫秒调用一次。
创建静态变量的方法是根据您的需要声明它们,然后定义它们;
double calcul::v1, calcul::v2; // same for other variables
这种类型的静态变量的定义必须在项目中的一个翻译单元(也就是源文件)中出现。
如果您希望从多个线程调用calcul::matrix()
,那么每个线程都需要同步对静态变量的访问(例如,使用互斥锁)。否则,你会遇到诸如竞赛状况,部分完成时抢先操作等问题。这可能意味着变量会获得意想不到的价值。
你可以做非static
,因为它们只在本地函数中使用的值:
void matrix() {
double v1, ..., vn;
// ..
}
或者你可以介绍某种同步原语成矩阵,以防止多个线程同时访问它:
class calcul {
std::mutex mtx;
static double v1, ..., vn;
};
void matrix() {
std::lock_guard<std::mutex> lk(mtx);
// ...
};
最后,如果你的编译器支持的话,你可以把这些变量static thread_local
:
class calcul {
static thread_local double v1, ..., vn;
};
哪些呢,从[basic.stc.thread]:
1与
thread_local
关键字声明的所有变量都线程存储时限。这些实体的存储应持续创建它们的线程的持续时间。每个线程都有一个独特的对象或引用,并且使用声明的名称是指与当前线程关联的实体。2具有线程存储持续时间的变量应在其第一次使用odr(3.2)之前初始化,如果构造,应在线程退出时销毁 。
静态变量来自您的类calcul命名空间,并且只在内存中分配一次,因此对于您拥有的每个对象或线程都是相同的。
无论您何时尝试访问来自不同线程的相同变量(相同的内存地址),都需要使用互斥锁或信号量,以便安全地执行事务/操作。
例子:
#include <mutex>
class calcul{
std::mutex mtx;
....
}
void matrix()
{
//lock the resources below to the current thread only
mtx.lock();
//do stuff with the variables (common resource)
mtx.unlock(); //when the current thread is finished, unlock the resource.
}
为什么不能” V1,V2 ......是局部变量矩阵?乳清他们需要静态吗? – jpo38 2015-02-11 13:01:40
针对计算时间问题。想象一下,v1 .. vn是大尺寸数组,例如 – Courier 2015-02-11 13:02:16
我不能以任何方式将第一句与最后一句结合起来,这会导致明确的问题。也许试着重新说出它,因为我不知道你在说什么。静态变量初始化?并行性和线程安全性?两者都不是,完全是另一回事? – DevSolar 2015-02-11 13:02:55