-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmutex.cpp
More file actions
86 lines (76 loc) · 1.59 KB
/
mutex.cpp
File metadata and controls
86 lines (76 loc) · 1.59 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
// Mutex.cpp
#include "mutex.h"
Mutex::Mutex(Mutex::Type type /* = Mutex::TIMED */)
{
Helper::init(_mtx, type);
}
Mutex::~Mutex()
{
pthread_mutex_destroy(&_mtx);
}
int
Mutex::tryLock()
{
return pthread_mutex_trylock(&_mtx);
}
int
Mutex::lock()
{
return pthread_mutex_lock(&_mtx);
}
int
Mutex::unlock()
{
return pthread_mutex_unlock(&_mtx);
}
//////////////////////////////////////////////////////////////////////////
Mutex::Helper::Helper(Mutex& lock)
:_pMutex(&lock)
,_pMtx(NULL)
{
lock.lock();
}
Mutex::Helper::Helper(pthread_mutex_t& lock)
:_pMutex(NULL)
,_pMtx(&lock)
{
pthread_mutex_lock(_pMtx);
}
/* virtual */
Mutex::Helper::~Helper()
{
// 两个指针的单一性由构造函数保证。
if (_pMutex)
_pMutex->unlock();
else if(_pMtx)
pthread_mutex_unlock(_pMtx);
}
/* static */
void Mutex::Helper::init(pthread_mutex_t& lock, Mutex::Type type /* = Mutex::TIMED */)
{
int attrType = PTHREAD_MUTEX_TIMED_NP;
switch(type)
{
case Mutex::ADAPTIVE:
attrType = PTHREAD_MUTEX_ADAPTIVE_NP;
break;
case Mutex::RECURSIVE:
attrType = PTHREAD_MUTEX_RECURSIVE_NP;
break;
case Mutex::ERRORCHECK:
attrType = PTHREAD_MUTEX_ERRORCHECK_NP;
break;
case Mutex::TIMED:
default:
break;
}
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, attrType);
pthread_mutex_init(&lock, &attr);
pthread_mutexattr_destroy(&attr);
}
/* static */
void Mutex::Helper::destroy( pthread_mutex_t& lock ) {
pthread_mutex_destroy(&lock);
}