#pragma once #include #include #include #include #include #include #include #include #include #include // 添加 errno 支持 // 类型别名 #ifndef DWORD_DEFINED #define DWORD_DEFINED typedef unsigned long DWORD; // 定义DWORD #endif using UINT64 = uint64_t; // 常量定义 #ifndef INFINITE #define INFINITE 0xFFFFFFFF #endif #ifndef WAIT_OBJECT_0 #define WAIT_OBJECT_0 0 #endif #ifndef WAIT_TIMEOUT #define WAIT_TIMEOUT 258 #endif // 原子操作函数 inline DWORD AtomicCompareExchange(volatile DWORD* dest, DWORD exchange, DWORD compare) { return __sync_val_compare_and_swap(dest, compare, exchange); } class CcosLock { protected: DWORD m_LockThreadId = 0; // 持有锁的线程ID volatile DWORD m_RefCount = 0; // 引用计数 volatile DWORD m_InterLock = 0;// 内部锁状态 pthread_mutex_t m_Mutex; // 互斥锁 pthread_cond_t m_Cond; // 条件变量 bool CcosInternal_EnterCriticalSection(DWORD TryCount); void CcosInternal_LeaveCriticalSection(); bool Try_Clear_DeadThread(); int FindProcessThreads(DWORD dwOwnerTID); DWORD Thread_WaitUnlockNotify(DWORD timeout = INFINITE); public: CcosLock(); virtual ~CcosLock(); DWORD Thread_Lock(DWORD timeout = INFINITE); void Thread_UnLock(); bool Thread_Clear(DWORD Tid); }; // 全局清理函数 void CleanupForThread(DWORD Tid); // C接口函数 extern "C" { bool Ccos_ThreadLock(volatile UINT64 *pLock); void Ccos_ThreadUnLock(volatile UINT64 *pLock); void Ccos_ThreadClearForTid(volatile UINT64 *pLock, DWORD Tid); DWORD Proc_Lock(DWORD timeout); void Proc_UnLock(); DWORD Thread_GetUniqTick(); } // Linux 辅助函数 #ifndef GET_CURRENT_THREAD_ID_DEFINED #define GET_CURRENT_THREAD_ID_DEFINED inline DWORD GetCurrentThreadId() { return static_cast(syscall(SYS_gettid)); } #endif inline DWORD GetTickCount() { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return static_cast(ts.tv_sec * 1000 + ts.tv_nsec / 1000000); } inline int IsThreadAlive(DWORD dwTid) { return pthread_kill(static_cast(dwTid), 0) == 0 ? 1 : 0; }