在下面的代码中,我收到一个错误,即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] );
}
答案 0 :(得分:2)
您可能已经意识到这一点(我认为您的问题有点不清楚),但您所犯的错误是由于您没有定义acc_locks。这很奇怪,因为你确实定义了平衡,但没有定义acc_locks。只需添加
pthread_mutex_t AccountMonitor::acc_locks[num_accounts];
到AccountMonitor.cpp
答案 1 :(得分:1)
您可以通过将互斥锁放在一个单独的类(作为非静态成员)中,然后在AccountMonitor
中拥有该类的静态实例来解决此问题。然后包含互斥锁的包装类可以在它的构造函数中初始化它们。