Мы выполняем проект с использованием потоков и мьютексов, чтобы имитировать группу клиентов, использующих разные или одинаковые банковские счета У меня практически нет опыта работы с C / C ++, и я думаю, что эта проблема связана с указателями. В основном у меня есть объект Client, который содержит список транзакций и список учетных записей и который передается в качестве параметра в pthread, где он отправляется в метод обработки.
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 или в main, или, возможно, RunTransactions? Любой совет будет высоко ценится!