- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
class Mutex
{
HANDLE m_Mutex;
public:
Mutex()
{
m_Mutex = CreateMutex(0, false, 0);
}
~Mutex()
{
ReleaseMutex(m_Mutex);
CloseHandle(m_Mutex);
}
void Lock()
{
auto lv_WaitResult = WaitForSingleObject(m_Mutex, 10000);
assert(lv_WaitResult != WAIT_TIMEOUT);
}
void Unlock()
{
ReleaseMutex(m_Mutex);
}
};
template<int C>
struct GLocker
{
static Mutex m_Mutex;
};
template<int C> Mutex GLocker<C>::m_Mutex;
class Locker
{
Mutex *m_Mutex;
public:
Locker(Mutex &_Mutex)
{
m_Mutex = &_Mutex;
m_Mutex->Lock();
}
virtual ~Locker()
{
m_Mutex->Unlock();
}
};
class ThreadCreator
{
protected:
static void NewThread(void *_Func)
{
(*(std::function<void()>*)_Func)();
delete (std::function<void()>*)_Func;
}
public:
static ThreadCreator g_ThreadCreator;
HANDLE operator=(const std::function<void()> &_Func)
{
std::function<void()> *lv_Func = new std::function<void()>(_Func);
return (HANDLE)_beginthread(ThreadCreator::NewThread,0,(void*)lv_Func);
}
};
ThreadCreator ThreadCreator::g_ThreadCreator;
#define LOCK const Locker _Lock##__LINE__##__COUNTER__ = GLocker<9000 + __COUNTER__>::m_Mutex // 9000 является запасом для пользовательских номеров.
#define LOCK_EX(Port) const Locker _Lock##__LINE__##__COUNTER__ = GLocker<Port>::m_Mutex // блокирует определённый мьютекс, полезно когда нужно делать синхронизацию из разных мест.
#define GO_FUNC ThreadCreator::g_ThreadCreator =
#define GO_EX(...) GO_FUNC [__VA_ARGS__]() mutable -> void
#define GO GO_FUNC []() -> void