一種簡單的跨平台互斥鎖

2022-09-23 13:27:07 字數 3299 閱讀 8858

前言  

互斥鎖,用來保證任一時刻只有單個執行緒或程序擁有對共享資源的互斥訪問權,在這裡將posix thread中的互斥體、win32中的互斥體和臨界區,統稱為互斥鎖,其特點如下

● 範圍:執行緒鎖和程序鎖,前者僅用於同一程序內多執行緒間,而後者用於程序間,顯然,它也能用於同一程序內多執行緒間,但效率較低。posix的互斥體既可以是執行緒鎖,也可以是程序鎖,這由它的乙個屬性決定:pthread_process_shared或pthread_process_private。win32中的臨界區是一種執行緒鎖,而互斥體既可以是執行緒鎖,也可以是程序鎖,這由它的乙個名稱決定:createmutex中的第3個引數。

● 型別:posix中的互斥體,包括普通鎖、遞迴鎖、檢測鎖和適應鎖四種;而win32中的臨界區在同一執行緒內可多次加鎖和解鎖,相當於遞迴鎖,而互斥體則相當於普通鎖。

● 操作:包括建立鎖、加鎖、解鎖、檢測鎖和銷毀鎖5種操作,其中加鎖操作又可分為永久等待和超時等待2種。對於win32中的臨界區,不存在超時等待的加鎖。

介面   所有鎖操作,成功返回0,失敗posix返回非0的錯誤碼,win32返回-1,呼叫getlasterror可獲取錯誤碼。對於超時加鎖,第2個引數超時不是時間差,而是絕對到期時間。對於win32中的互斥體,廢棄返回1,超時返回2。

1 #ifdef __cplusplus

2  extern "c" ;

27 }mutex_t;

28 typedef void mutexattr_t;

2930 #else

31 #error currently only support win32 and posix thread models

32 #endif

3334 #define mutex_thread_shared  1

35 #define mutex_process_shared 2

3637 int mutex_init(mutex_t* m,int scope,int type,const char* name,mutexattr_t* attr,security_attributes* sa);

3839 int mutex_lock(mutex_t* m);

4041 int mutex_timedlock(mutex_t* m,const struct timeval* val);

4243 int mutex_trylock(mutex_t* m);

4445 int mutex_unlock(mutex_t* m);

4647 int mutex_destroy(mutex_t* m);

4849 #ifdef __cplusplus

50 }

51 #endif

實現   1 int mutex_init(mutex_t* m,int scope,int type,const char* name,mutexattr_t* attr,security_attributes* sa)

2  12     if(0==ret && 0 != scope)

13     

18     if(0==ret && 0 != type)

19     

24     if (0==ret)

25         ret = pthread_mutex_init(m,attr);

26     if (1==init && attr==&tmp)

27         pthread_mutexattr_destroy(attr);

28     return ret;

29 #else

30     m->type_ = scope;

31     switch (m->type_)

32     

38         __except(exception_execute_handler)

39         

42         return 0;

43 44     case mutex_process_shared:

45         m->proc_lock_ = createmutexa(sa,false,name);

46         if (0==m->proc_lock_&&error_access_denied==getlasterror())

47             m->proc_lock_ = openmutexa(mutex_all_access,false,name);

48         if (0==m->proc_lock_)

49             return -1;       

50         return 0;

51 52     default: return -1;

53     }

54 #endif

55 }

56 57 int mutex_lock(mutex_t* m)

58 

75         break;

76 77     default: return -1;

78     }

79 #endif

80 }

81 82 int mutex_timedlock(mutex_t* m,const struct timeval* val)

83  ;

87     return pthread_mutex_timedlock(m,&ts);

88 #else

89     switch(m->type_)

90     

111         }

112         break;

113114     default: return -1;

115     }

116 #endif

117 }

118119 int mutex_trylock(mutex_t* m)

120 

139         break;

140141     default: return -1;

142     }

143 #endif

144 }

145146 int mutex_unlock(mutex_t* m)

147 

164 #endif

165 }

166www.2cto.com

167 int mutex_destroy(mutex_t* m)

168 

185 #endif

186 }

作者:春秋十二月

一種簡單的跨平台使用者態自旋鎖

前言 自旋鎖作為一種併發同步的手段,特別適用於競爭少和鎖時間短的情況,在驅動及核心 中經常被用到,本文講述一種適合使用者態程式的自旋鎖,支援win32 vc和linux gcc 4.1.2 平台,並提供了c語言的介面和實現,詳見下文。介面 1 ifdef cplusplus 2extern c sp...

對互斥鎖的一種封裝

include typedef pthread t mutex t 主要用於定義互斥鎖的定義,以及提供加鎖解鎖的介面 class sth mutex sth mutex private int lock int unlock int destroy private mutex t mutex end...

互斥鎖mutex的簡單實現

mutex一般用於為一段 加鎖,以保證這段 的原子性 atomic 操作,即 要麼不執行這段 要麼將這段 全部執行完畢。例如,最簡單的併發衝突問題就是乙個變數自增1 balance balance 1 表面看這是一條語句,可是在背後的彙編中我們可以看到,指令集操作過程中會引入中間變數來儲存右邊的值,...