2015-02-11 192 views
-1

如何创建一个静态函数,其变量不需要在其中创建(对于计算问题),考虑到可以通过不同的线程调用该函数? 实施例:静态函数和多线程中的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()可以每毫秒调用一次。

+0

为什么不能” V1,V2 ......是局部变量矩阵?乳清他们需要静态吗? – jpo38 2015-02-11 13:01:40

+0

针对计算时间问题。想象一下,v1 .. vn是大尺寸数组,例如 – Courier 2015-02-11 13:02:16

+0

我不能以任何方式将第一句与最后一句结合起来,这会导致明确的问题。也许试着重新说出它,因为我不知道你在说什么。静态变量初始化?并行性和线程安全性?两者都不是,完全是另一回事? – DevSolar 2015-02-11 13:02:55

回答

0

创建静态变量的方法是根据您的需要声明它们,然后定义它们;

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

这种类型的静态变量的定义必须在项目中的一个翻译单元(也就是源文件)中出现。

如果您希望从多个线程调用calcul::matrix(),那么每个线程都需要同步对静态变量的访问(例如,使用互斥锁)。否则,你会遇到诸如竞赛状况,部分完成时抢先操作等问题。这可能意味着变量会获得意想不到的价值。

+0

我是否应该理解静态成员不适用于多线程? – Courier 2015-02-11 13:13:56

+0

广义而言,除非对它们进行同步,否则不建议使用多线程静态。与线程之间共享的任何变量相同,如果存在并发读者和写者,则为静态或非静态变量。静力学也引入了很多其他的担忧,这就是为什么他们普遍气馁 - 虽然他们有自己的位置。 – Rob 2015-02-11 13:27:23

+0

非常感谢Rob! – Courier 2015-02-11 13:29:33

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

+0

但问题在于,如果v1,... vn是大尺寸数组,那么您将会遇到计算时间问题;也就是说,您提出的方式在处理时间方面效率不高。 – Courier 2015-02-11 13:10:48

+0

@polar我提出了三件事情。没有我提出的“方式”。 – Barry 2015-02-11 13:17:30

+0

谢谢巴里,但我看到东西变得越来越复杂。我使用静态的目的是出于人体工程学的原因,即使用matrix()而不创建对象。我发现实现这一点并不那么简单...... – Courier 2015-02-11 13:20:19

0

静态变量来自您的类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. 
}