#include <CRITICAL.HPP>
using namespace CxxlMan;
class A;
class B;
class A
{
CriticalSec csObject;
int m_i,m_j;
public:
A()
{
m_i = 0;
m_j = 0;
}
void put(int i,int j)
{
csObject.Enter();
m_i = i;
m_j = j;
csObject.Leave();
}
int get(B *B_Obj);
};
class B
{
CriticalSec csObject;
int m_i,m_j;
public:
B()
{
m_i = 0;
m_j = 0;
}
void Put(int &I,int &J)
{
csObject.Enter();
m_i = I++;
m_j = J++;
csObject.Leave();
}
void Send(A *A_Obj)
{
// 先複製資料
csObject.Enter();
int I = m_i;
int J = m_j;
csObject.Leave();
A_Obj->put(I,J); // 先離開 CriticalSec 再叫用其他有 CriticalSec 保護的物件
}
};
int A::get(B *B_Obj)
{
// 先複製資料
csObject.Enter();
int I = m_i;
int J = m_j;
csObject.Leave();
B_Obj->Put(I,J); // 先離開 CriticalSec 再叫用其他有 CriticalSec 保護的物件
CriticalSecHandle AutoCSH(csObject); // 再一次進入 CriticalSec 以更新資料
int m_i = I;
int m_j = J;
return m_i + m_j;
}