#include <iostream>
#include <sstream>
#include <pthread.h>
#include <cstdlib>
#include <unistd.h>
using namespace std;
class Account {
private:
long _balance;
pthread_mutex_t mutex;
public:
explicit Account(long balance): _balance(balance) { pthread_mutex_init(&mutex,NULL); }
virtual ~Account() { pthread_mutex_destroy(&mutex);}
void Deposit(long val);
long Withdraw(long val);
friend ostream& operator << (ostream& os, const Account& acct);
};
inline ostream& operator << (ostream& os, const Account& acct) {
os << acct._balance;
return os;
}
typedef struct {
Account* a;
Account* b;
} Accts;
void Account::Deposit(long val) {
pthread_mutex_lock(&mutex);
_balance += val;
pthread_mutex_unlock(&mutex);
}
long Account::Withdraw(long val) {
pthread_mutex_lock(&mutex);
_balance -= val;
pthread_mutex_unlock(&mutex);
return val;
}
void* PerformDrawer(void* param) {
Accts* acct = static_cast<Accts*>(param);
long l = 0;
for( int i = 0;i < 50;i++ ) {
cout << "[W" << i << "]:Draw money 300 from A and deposit the money into B.. " << endl;
l = acct->a->Withdraw(300);
acct->b->Deposit(l);
cout << "current balances - A:" << *(acct->a) << ",B:" << *(acct->b) << endl;
sleep(1);
}
}
void* PerformDepositter(void* param) {
Accts* acct = static_cast<Accts*>(param);
for( int i = 0;i < 50;i++ ) {
cout << "[D" << i << "]:Deposit money 500 into A.. " << endl;
acct->a->Deposit(500);
cout << "current balances - A:" << *(acct->a) << ",B:" << *(acct->b) << endl;
sleep(1);
}
}
void InitThreadAttr(pthread_attr_t* attr) {
pthread_attr_init(attr);
pthread_attr_setdetachstate(attr,PTHREAD_CREATE_JOINABLE);
}
int main() {
pthread_t depositter;
pthread_t withdrawer;
void *status_depositter;
void *status_withdrawer;
Account A(4000);
Account B(2000);
Accts accts;
accts.a = &A;
accts.b = &B;
pthread_attr_t attr;
InitThreadAttr(&attr);
pthread_create(&depositter, &attr,PerformDepositter,(void *)&accts);
pthread_create(&withdrawer, &attr,PerformDrawer,(void *)&accts);
pthread_attr_destroy(&attr);
pthread_join(depositter, &status_depositter);
pthread_join(withdrawer, &status_withdrawer);
cout << "A:" << A << endl;
cout << "B:" << B << endl;
pthread_exit(NULL);
}
実行結果は以下の通り(途中略)
[D46]:Deposit money 500 into A.. current balances - A:13700,B:15800 [W46]:Draw money 300 from A and deposit the money into B.. current balances - A:13400,B:16100 [D47]:Deposit money 500 into A.. current balances - A:13900,B:16100 [W47]:Draw money 300 from A and deposit the money into B.. current balances - A:13600,B:16400 [D48]:Deposit money 500 into A.. current balances - A:14100,B:16400 [W48]:Draw money 300 from A and deposit the money into B.. current balances - A:13800,B:16700 [D49]:Deposit money 500 into A.. current balances - A:14300,B:16700 [W49]:Draw money 300 from A and deposit the money into B.. current balances - A:14000,B:17000 A:14000 B:17000
0 件のコメント:
コメントを投稿