在C ++中初始化pthread互斥锁的静态数组

时间:2013-11-28 06:37:11

标签: c++ pthreads

在下面的代码中,我收到一个错误,即acc_locks是add_to_balance函数中未定义的引用。 acc_locks是一个pthread_mutex_t数组。

我认为错误是由于在调用构造函数之前未对互斥锁进行初始化。

我想用PTHREAD_MUTEX_INITIALIZER初始化它们,但我不知道如何在不写出100次的情况下完成它。 (我原则上不会这样做)

acc_locks = {PTHREAD_MUTEX_INITIALIZER, ... } //100 times

本文Static pthreads mutex initialization描述了如何使用P99_DUPL在C中完成此操作。我不能使用C99 w / C ++。是否有类似的C ++复制宏?我想解决错误的问题吗?

//AccountMonitor.h
#include <pthread.h>

static const unsigned char num_accounts = 100;

class AccountMonitor{
  private:
    static float balance[ num_accounts];
    static pthread_mutex_t acc_locks[ num_accounts];
  public:
    AccountMonitor();
    void add_to_balance(int acc,float v);

};


//AccountMonitor.cpp
#include "AccountMonitor.h"

float AccountMonitor::balance[ num_accounts] = {0.0};

AccountMonitor::AccountMonitor(){
    for (int i=0; i<num_accounts; i++){ 
        pthread_mutex_init( &acc_locks[i], NULL );
    }
}

void AccountMonitor::add_to_balance(int acc, float v){
    int index = acc - 1;

    pthread_mutex_lock( &acc_locks[ index] );
    balance[ index] += v;
    pthread_mutex_unlock ( &acc_locks[index] );

}

2 个答案:

答案 0 :(得分:2)

您可能已经意识到这一点(我认为您的问题有点不清楚),但您所犯的错误是由于您没有定义acc_locks。这很奇怪,因为你确实定义了平衡,但没有定义acc_locks。只需添加

pthread_mutex_t AccountMonitor::acc_locks[num_accounts];

到AccountMonitor.cpp

答案 1 :(得分:1)

您可以通过将互斥锁放在一个单独的类(作为非静态成员)中,然后在AccountMonitor中拥有该类的静态实例来解决此问题。然后包含互斥锁的包装类可以在它的构造函数中初始化它们。