acl  3.5.3.0
locker.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include "noncopyable.hpp"
4 #include <stdlib.h>
5 #if !defined(_WIN32) && !defined(_WIN64)
6 #include <pthread.h>
7 #endif
8 
9 #if defined(_WIN32) || defined(_WIN64)
10 struct acl_pthread_mutex_t;
11 #else
12 # ifndef acl_pthread_mutex_t
13 # define acl_pthread_mutex_t pthread_mutex_t
14 # endif
15 #endif
16 
17 namespace acl {
18 
19 /**
20  * 互斥锁,可以同时创建文件锁和线程锁,也可以只创建一种锁
21  */
23 {
24 public:
25  /**
26  * 构造函数
27  * @param use_mutex {bool} 是否创建线程锁
28  * @param use_spinlock {bool} 内部当使用线程锁时是否需要自旋锁
29  */
30  locker(bool use_mutex = true, bool use_spinlock = false);
31  virtual ~locker();
32 
33  /**
34  * 根据文件路径创建文件锁
35  * @param file_path {const char*} 文件路径,非空
36  * @return {bool} 是否成功
37  * 注:此函数与下面的 open 函数仅能同时调用一个
38  */
39  bool open(const char* file_path);
40 
41  /**
42  * 根据文件句柄创建文件锁
43  * @param fh {int} 文件句柄
44  * @return {bool} 是否成功
45  */
46 #if defined(_WIN32) || defined(_WIN64)
47  bool open(void* fh);
48 #else
49  bool open(int fh);
50 #endif
51 
52  /**
53  * 针对已经打开的锁(包括线程锁和文件锁)进行加锁
54  * @return {bool} 加锁是否成功
55  */
56  bool lock();
57 
58  /**
59  * 尝试对已经打开的锁(包括线程锁和文件锁)进行加锁
60  * @return {bool} 加锁是否成功
61  */
62  bool try_lock();
63 
64  /**
65  * 针对已经打开的锁(包括线程锁和文件锁)进行解锁
66  * @return {bool} 解锁是否成功
67  */
68  bool unlock();
69 
70 private:
71  acl_pthread_mutex_t* mutex_;
72  char* pFile_;
73 #if defined(_WIN32) || defined(_WIN64)
74  void* fHandle_;
75 #else
76  int fHandle_;
77  pthread_mutexattr_t mutex_attr_;
78 # if !defined(MINGW) && !defined(__APPLE__) && !defined(ANDROID)
79  pthread_spinlock_t* spinlock_;
80 # endif
81 #endif
82  bool myFHandle_;
83 
84  void init_mutex(bool use_spinlock);
85 };
86 
88 {
89 public:
90  lock_guard(locker& lk);
91  ~lock_guard();
92 
93 private:
94  locker& lk_;
95 };
96 
97 } // namespace acl
#define ACL_CPP_API