静态函数和多线程中的C ++静态成员

时间:2015-02-11 12:57:01

标签: c++ multithreading static

如何创建一个静态函数,其变量不需要在其中创建(用于计算问题),考虑到这个函数可以被不同的线程调用? 例如:

class calcul {
    static double **v1, **v2, ...,**vn;

public:
    calcul();
    ~calcul();

    static void matrix();
}; 

matrix()使用v1,...,vn

问题是:当从不同的线程多次调用calcul::matrix()时,是否会产生冲突,即线程A可以修改与线程A相关的v1?

我的目标是使用'静态'从某种意义上来说,我不会需要创建相应的对象。事实上,Class' clacul'将成为需要用于实时应用程序的库的一部分。这意味着calcul()可以每毫秒调用一次。

3 个答案:

答案 0 :(得分:1)

您可以将值设为非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具有线程存储持续时间的变量应在其第一次使用之前初始化(3.2),如果构造,   应在线程退出时销毁。

答案 1 :(得分:0)

创建静态变量的方法是按原样声明它们,然后定义它们;

double calcul::v1, calcul::v2;   // same for other variables

这种静态变量的定义必须在项目中的一个翻译单元(也就是成为对象的源文件)中发生。

如果您希望从多个线程调用calcul::matrix(),那么每个线程都需要同步对静态变量的访问(例如,使用互斥锁)。否则会出现诸如竞争条件,部分完成时被抢占等操作等问题。这可能意味着变量会产生意外值。

答案 2 :(得分:0)

静态变量来自您的类calcul命名空间,并且只在内存上分配一次,因此对于您拥有的每个对象或线程都是相同的。

每当您尝试从不同的线程访问相同的变量(相同的内存地址)时,您需要使用Mutex或Semaphores,以便安全地执行事务/操作。

示例:

#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.
}