CcosLock.h 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #pragma once
  2. #include <pthread.h>
  3. #include <signal.h>
  4. #include <unistd.h>
  5. #include <sys/syscall.h>
  6. #include <cstdint>
  7. #include <ctime>
  8. #include <atomic>
  9. #include <map>
  10. #include <algorithm>
  11. #include <cerrno> // 添加 errno 支持
  12. // 类型别名
  13. #ifndef DWORD_DEFINED
  14. #define DWORD_DEFINED
  15. typedef unsigned long DWORD; // 定义DWORD
  16. #endif
  17. using UINT64 = uint64_t;
  18. // 常量定义
  19. #ifndef INFINITE
  20. #define INFINITE 0xFFFFFFFF
  21. #endif
  22. #ifndef WAIT_OBJECT_0
  23. #define WAIT_OBJECT_0 0
  24. #endif
  25. #ifndef WAIT_TIMEOUT
  26. #define WAIT_TIMEOUT 258
  27. #endif
  28. // 原子操作函数
  29. inline DWORD AtomicCompareExchange(volatile DWORD* dest, DWORD exchange, DWORD compare) {
  30. return __sync_val_compare_and_swap(dest, compare, exchange);
  31. }
  32. class CcosLock {
  33. protected:
  34. DWORD m_LockThreadId = 0; // 持有锁的线程ID
  35. volatile DWORD m_RefCount = 0; // 引用计数
  36. volatile DWORD m_InterLock = 0;// 内部锁状态
  37. pthread_mutex_t m_Mutex; // 互斥锁
  38. pthread_cond_t m_Cond; // 条件变量
  39. bool CcosInternal_EnterCriticalSection(DWORD TryCount);
  40. void CcosInternal_LeaveCriticalSection();
  41. bool Try_Clear_DeadThread();
  42. int FindProcessThreads(DWORD dwOwnerTID);
  43. DWORD Thread_WaitUnlockNotify(DWORD timeout = INFINITE);
  44. public:
  45. CcosLock();
  46. virtual ~CcosLock();
  47. DWORD Thread_Lock(DWORD timeout = INFINITE);
  48. void Thread_UnLock();
  49. bool Thread_Clear(DWORD Tid);
  50. };
  51. // 全局清理函数
  52. void CleanupForThread(DWORD Tid);
  53. // C接口函数
  54. extern "C" {
  55. bool Ccos_ThreadLock(volatile UINT64 *pLock);
  56. void Ccos_ThreadUnLock(volatile UINT64 *pLock);
  57. void Ccos_ThreadClearForTid(volatile UINT64 *pLock, DWORD Tid);
  58. DWORD Proc_Lock(DWORD timeout);
  59. void Proc_UnLock();
  60. DWORD Thread_GetUniqTick();
  61. }
  62. // Linux 辅助函数
  63. #ifndef GET_CURRENT_THREAD_ID_DEFINED
  64. #define GET_CURRENT_THREAD_ID_DEFINED
  65. inline DWORD GetCurrentThreadId() {
  66. return static_cast<DWORD>(syscall(SYS_gettid));
  67. }
  68. #endif
  69. inline DWORD GetTickCount() {
  70. struct timespec ts;
  71. clock_gettime(CLOCK_MONOTONIC, &ts);
  72. return static_cast<DWORD>(ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
  73. }
  74. inline int IsThreadAlive(DWORD dwTid) {
  75. return pthread_kill(static_cast<pthread_t>(dwTid), 0) == 0 ? 1 : 0;
  76. }