我们正在使用线程和互斥锁来模拟一群客户端访问不同或相同的银行账户。我几乎没有C/C++经验,我认为这个问题与指针有关。基本上,我有一个Client对象,它包含事务列表和一个帐户列表,并将其作为参数传递给pthread,并将其发送给处理方法。全局列表访问使用PThreads - 指针问题?
class Client{
public:
list<Transaction> transactions;
list<Account>* accounts;
Client(list<Transaction>, list<Account>);
};
Client::Client(list<Transaction> a, list<Account> b){
transactions = a;
accounts = &b;
}
extern "C"
{
void* RunTransactions(void* arg)
{
Client* c = static_cast<Client*>(arg);
// while(!(*c).transactions.empty()){
// cout << "HERE" << endl;
// }
cout << "Thread Before: ";
(*(*c).accounts).front().Print();
(*(*c).accounts).front().balance -= 25;
(*(*c).accounts).front().balance -= 25;
(*(*c).accounts).front().balance -= 25;
cout << "Thread After: ";
(*(*c).accounts).front().Print();
// list<Transaction>* trans = static_cast<list<Transaction>*>(arg);
// Transaction t = trans->front();
// t.Print();
// Test* t = static_cast<Test*>(arg);
// (*t).Increase();
// cout << "Thread - " << t->x << endl;
return 0;
}
}
int main(){
list<Account> accounts;
cout << "Accounts: ";
cin >> NumAccts;
for(long i = 0; i < NumAccts; i++){
long tempBalance;
cout << "Balance for Account " << i << ": ";
cin >> tempBalance;
accounts.push_back(Account(i, tempBalance));
}
//Test Input
pthread_t t1;
list<Transaction> tempTrans;
tempTrans.push_back(Transaction(0, 1, 100));
tempTrans.push_back(Transaction(1, 0, 50));
tempTrans.push_back(Transaction(2, 1, 222));
Client c = Client(tempTrans, accounts);
cout << "Main Before: ";
accounts.front().Print();
pthread_create(&t1, NULL, RunTransactions, &c);
pthread_join(t1, NULL);
cout << "Main After: ";
accounts.front().Print();
return 0;
}
我不明白的是我应该如何让我的线程都可以访问在main中创建的帐户列表?现在,无论什么时候我从客户端拉出帐户列表,都会对线程进行更改,但在连接后,我看不到主要帐户列表中的更改。同样,我认为它与我在Client对象或主要或可能的RunTransactions中传递或访问帐户的方式有关?任何意见将不胜感激!
与你的问题无关,但你为什么避免使用' - >'运算符? –