-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmutex.hpp
More file actions
133 lines (110 loc) · 1.64 KB
/
mutex.hpp
File metadata and controls
133 lines (110 loc) · 1.64 KB
1
2
3
4
5
6
7
8
9
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
mutex.h
sdragonx 2015.01.31 1:49:42
*/
#ifndef CGL_MUTEX_H_20150131014942
#define CGL_MUTEX_H_20150131014942
#if defined(_WIN32) || defined(_WIN64)
#include <windows.h>
namespace cgl{
class mutex_t
{
private:
CRITICAL_SECTION m_cs;
public:
mutex_t()
{
InitializeCriticalSection(&m_cs);
}
~mutex_t()
{
DeleteCriticalSection(&m_cs);
}
void lock()
{
EnterCriticalSection(&m_cs);
}
void unlock()
{
LeaveCriticalSection(&m_cs);
}
private://uncopyable
mutex_t(const mutex_t&);
mutex_t& operator=(const mutex_t&);
};
}//end namespace cgl
#else//posix
#include <pthread.h>
namespace cgl{
class mutex_t
{
private:
pthread_mutex_t m_mutex;
public:
mutex_t()
{
pthread_mutex_init(&m_mutex, NULL);
}
~mutex_t()
{
pthread_mutex_destroy(&m_mutex);
}
void lock()
{
pthread_mutex_lock(&m_mutex);
}
void unlock()
{
pthread_mutex_unlock(&m_mutex);
}
private://uncopyable
mutex_t(const mutex_t&);
mutex_t& operator=(const mutex_t&);
friend class cond_t;
};
class cond_t
{
private:
pthread_cond_t m_cond;
public:
cond_t()
{
pthread_cond_init(&m_cond, NULL);
}
~cond_t()
{
pthread_cond_destroy(&m_cond);
}
void wait(mutex_t& mutex)
{
pthread_cond_wait(&m_cond, &mutex.m_mutex);
}
void broadcast()
{
pthread_cond_broadcast(&m_cond);
}
};
}//end namespace cgl
#endif
//
// auto_lock
//
namespace cgl{
class auto_lock
{
public:
explicit auto_lock(mutex_t& mutex):m_mutex(mutex)
{
m_mutex.lock();
}
~auto_lock()
{
m_mutex.unlock();
}
private:
mutex_t& m_mutex;
auto_lock(const auto_lock&);
auto_lock& operator=(const auto_lock&);
};
}// end namespace cgl
#endif //CGL_MUTEX_H_20150131014942