一个简单的线程锁------pthread和win32的临界区(Critical Section)

临界区:

临界区是指一个小代码段,在代码能够执行前,它必须独占对某些资源的访问权。这是让若干代码能够"以原子操作方式"来使用资源的一种方法。

所谓原子(atomic)操作方式,是指这段代码知道没有别的线程要访问这个资源.

说明:

1.  MacOSX,Windows有自己的线程模型, pthread可以说是跨平台的线程编程模型解决方案,当然对pthread不熟悉的也可以使用本地线程模型, 

其实pthread的win32版本也是基于本地线程模型的, pthread-win32的mutex是用户态的临界区实现,和win32的内核对象Mutex不同.

 

2. POSIX线程(POSIX threads),简称Pthreads,是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。在类Unix操作系统(Unix、Linux、Mac OS X等)中,

都使用Pthreads作为操作系统的线程。Windows操作系统也有其移植版pthreads-win32。

 

3. 临界区属于用户模式对象,实际上这种说法并不完全正确。如果一个线程试图进入另一个线程所拥有的临界区,那么这个线程就会被置为等待状态。

而进入等待状态的唯一方法是使用线程从用户模式转入内核模式,所以追求高效的实现临界区时就是想办法避免进入等待状态下的内核模式.

 1 //一个简单的线程锁
 2 #ifndef _THREADLOCK_H 
 3 #define _THREADLOCK_H 
 4 
 5 #ifdef WIN32 
 6 #include <Windows.h> 
 7 #else 
 8 #include <pthread.h> 
 9 #endif 
10 
11 #ifdef WIN32 
12 #define LOCK_MUTEXT CRITICAL_SECTION
13 #define INIT_LOCK(X) InitializeCriticalSection(X)
14 #define DO_LOCK(X) EnterCriticalSection(X)
15 #define DO_UNLOCK(X) LeaveCriticalSection(X)
16 #define DESTROY_LOCK(X) DeleteCriticalSection(X)
17 #else 
18 #define LOCK_MUTEXT pthread_mutex_t
19 #define INIT_LOCK(X) pthread_mutex_init(X,NULL)
20 #define DO_LOCK(X) pthread_mutex_lock(X)
21 #define DO_UNLOCK(X) pthread_mutex_unlock(X)
22 #define DESTROY_LOCK(X) pthread_mutex_destroy(X)
23 #endif 
24 
25 class CThreadLock 
26 { 
27 public: 
28     CThreadLock(void) 
29     { 
30         Init(); 
31     }; 
32 
33     ~CThreadLock() 
34     { 
35         Close(); 
36     }; 
37 
38     void Init() 
39     { 
40         INIT_LOCK(&m_lock);
41     }; 
42 
43     void Close() 
44     { 
45         DESTROY_LOCK(&m_lock);
46     } 
47 
48     void Lock() 
49     { 
50         DO_LOCK(&m_lock);
51     }; 
52 
53     void UnLock() 
54     { 
55         DO_UNLOCK(&m_lock);
56     }; 
57 
58 private: 
59     LOCK_MUTEXT m_lock; 
60 }; 
61 
62 //自动加锁的类 
63 class CAutoLock 
64 { 
65 public: 
66     CAutoLock(CThreadLock* pThreadLock)  
67     {  
68         m_pThreadLock = pThreadLock; 
69         if(NULL != m_pThreadLock) 
70         { 
71             m_pThreadLock->Lock(); 
72         } 
73     }; 
74     ~CAutoLock()  
75     { 
76         if(NULL != m_pThreadLock) 
77         { 
78             m_pThreadLock->UnLock(); 
79         } 
80     }; 
81     
82 private: 
83     CThreadLock* m_pThreadLock; 
84 }; 
85 
86 #endif 

 

posted @ 2016-04-21 09:27  pilipalajun  阅读(1888)  评论(0编辑  收藏  举报