CcosLock.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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>
  12. #include <cstdio>
  13. // 类型别名
  14. using DWORD = unsigned long;
  15. using UINT64 = uint64_t; // 64位无符号整数
  16. // 常量定义
  17. #ifndef INFINITE
  18. #define INFINITE 0xFFFFFFFF
  19. #endif
  20. #ifndef WAIT_OBJECT_0
  21. #define WAIT_OBJECT_0 0
  22. #endif
  23. #ifndef WAIT_TIMEOUT
  24. #define WAIT_TIMEOUT 258
  25. #endif
  26. // 原子操作函数
  27. inline DWORD AtomicCompareExchange(std::atomic<DWORD>* dest, DWORD exchange, DWORD compare) {
  28. DWORD expected = compare;
  29. dest->compare_exchange_strong(expected, exchange, std::memory_order_acq_rel);
  30. return expected;
  31. }
  32. class CcosLock {
  33. protected:
  34. std::atomic<DWORD> m_LockThreadId{ 0 }; // 持有锁的线程ID
  35. std::atomic<DWORD> m_RefCount{ 0 }; // 引用计数
  36. std::atomic<DWORD> m_InterLock{ 0 }; // 内部锁状态
  37. pthread_mutex_t m_Mutex; // 互斥锁
  38. pthread_cond_t m_Cond; // 条件变量
  39. std::atomic<bool> m_IsDestroyed{ false };// 销毁标志
  40. bool CcosInternal_EnterCriticalSection(DWORD TryCount);
  41. void CcosInternal_LeaveCriticalSection();
  42. bool Try_Clear_DeadThread();
  43. int FindProcessThreads(DWORD dwOwnerTID);
  44. DWORD Thread_WaitUnlockNotify(DWORD timeout = INFINITE);
  45. public:
  46. CcosLock();
  47. virtual ~CcosLock();
  48. DWORD Thread_Lock(DWORD timeout = INFINITE);
  49. void Thread_UnLock();
  50. bool Thread_Clear(DWORD Tid);
  51. bool IsDestroyed() const { return m_IsDestroyed; }
  52. };
  53. // 全局清理函数
  54. void CleanupForThread(DWORD Tid);
  55. // C接口函数
  56. extern "C" {
  57. struct ThreadLock {
  58. std::atomic<DWORD> thread_id{ 0 };
  59. std::atomic<DWORD> ref_count{ 0 };
  60. };
  61. bool Ccos_ThreadLock(ThreadLock* pLock);
  62. void Ccos_ThreadUnLock(ThreadLock* pLock);
  63. void Ccos_ThreadClearForTid(ThreadLock* pLock, DWORD Tid);
  64. DWORD Proc_Lock(DWORD timeout);
  65. void Proc_UnLock();
  66. DWORD Thread_GetUniqTick();
  67. }
  68. // Linux 辅助函数
  69. inline DWORD GetCurrentThreadId() {
  70. return static_cast<DWORD>(syscall(SYS_gettid));
  71. }
  72. inline DWORD GetTickCount() {
  73. struct timespec ts;
  74. clock_gettime(CLOCK_MONOTONIC, &ts);
  75. return static_cast<DWORD>(ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
  76. }
  77. inline bool IsThreadAlive(DWORD tid) {
  78. char path[64];
  79. snprintf(path, sizeof(path), "/proc/%lu", tid);
  80. return access(path, F_OK) == 0; // 线程存在则/proc/[tid]目录存在
  81. }