#pragma once #include #include #include #include #include #include #include #include #include #include #include // 类型别名 using DWORD = unsigned long; using UINT64 = uint64_t; // 64位无符号整数 // 常量定义 #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(std::atomic* dest, DWORD exchange, DWORD compare) { DWORD expected = compare; dest->compare_exchange_strong(expected, exchange, std::memory_order_acq_rel); return expected; } class CcosLock { protected: std::atomic m_LockThreadId{ 0 }; // 持有锁的线程ID std::atomic m_RefCount{ 0 }; // 引用计数 std::atomic m_InterLock{ 0 }; // 内部锁状态 pthread_mutex_t m_Mutex; // 互斥锁 pthread_cond_t m_Cond; // 条件变量 std::atomic m_IsDestroyed{ false };// 销毁标志 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); bool IsDestroyed() const { return m_IsDestroyed; } }; // 全局清理函数 void CleanupForThread(DWORD Tid); // C接口函数 extern "C" { struct ThreadLock { std::atomic thread_id{ 0 }; std::atomic ref_count{ 0 }; }; bool Ccos_ThreadLock(ThreadLock* pLock); void Ccos_ThreadUnLock(ThreadLock* pLock); void Ccos_ThreadClearForTid(ThreadLock* pLock, DWORD Tid); DWORD Proc_Lock(DWORD timeout); void Proc_UnLock(); DWORD Thread_GetUniqTick(); } // Linux 辅助函数 inline DWORD GetCurrentThreadId() { return static_cast(syscall(SYS_gettid)); } inline DWORD GetTickCount() { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return static_cast(ts.tv_sec * 1000 + ts.tv_nsec / 1000000); } inline bool IsThreadAlive(DWORD tid) { char path[64]; snprintf(path, sizeof(path), "/proc/%lu", tid); return access(path, F_OK) == 0; // 线程存在则/proc/[tid]目录存在 }