개념
: 변경되는 정책 클래스를 인라인 함수로 만들고, 해당 클래스를
템플릿 인자로 사용하는 기법을 말함.
특징
: c++에서 많이 사용됨.
알아야 하는 개념
: 멀티스레드는 실행 시간에 결정되는 것이 아님.
만드는 방법.
1) 인테퍼이스 클래스를 멤버로 사용하지 않음.
+)추가적으로 설정하는 함수도 필요 없음.
2) 템플릿 인자로 들어오는 클래스의 함수들을 인라인 함수로 만듦.
3) 템플릿 인자로 유입되는 클래스 타입을 멤버 객체로 가지고 있음.
-> 그 멤버 객체의 함수를 호출함.
#include <iostream>
#include <list>
using namespace std;
template<typename T> class List
{
private :
list<T> ll;
public:
void push_front(const T& a)
{
// Lock();
//...
ll.push_front(a);
// Unlock();
}
};
List<int> s;
int main()
{
s.push_front(10);
}
가) 전략 패턴, 인터페이스 클래스를 만들고, 정책에 사용해서
멀티스레드에 안전한 코드로 만들어라
나) 단위 전략 패턴. (위에서 설명한 내용) 을 이용해
코드를 구현하라.
가)번에 대한 코드
#include <iostream>
#include <list>
using namespace std;
class base
{
public:
virtual void Lock() = 0;
virtual void UnLock() = 0;
};
class MMutex : public base
{
public :
virtual void Lock() override
{
cout << "Lock " << endl;
}
virtual void UnLock() override
{
cout << "unLock" << endl;
}
};
template<typename T> class List
{
private :
list<T> ll;
base * obj = 0;
public:
void set(base* _obj)
{
obj = _obj;
}
void push_front(const T& a)
{
obj->Lock();
ll.push_front(a);
obj->UnLock();
}
};
List<int> s;
int main()
{
MMutex *mutexx = new MMutex;
s.set(mutexx);
s.push_front(10);
}
나)번에 대한 코드
#include <iostream>
#include <list>
using namespace std;
class NoMmutex
{
public:
inline void Lock()
{
}
inline void UnLock()
{
}
};
class MMutex
{
public :
inline void Lock()
{
cout << "Lock " << endl;
}
inline void UnLock()
{
cout << "unLock" << endl;
}
};
template<typename T, typename LLock = NoMmutex> class List
{
private :
list<T> ll;
LLock obj;
public:
void push_front(const T& a)
{
obj.Lock();
ll.push_front(a);
obj.UnLock();
}
};
List<int, MMutex> s;
int main()
{
s.push_front(10);
}