#pragma once #include #include #include #include #include #include #ifdef XN_LINUX #include #endif namespace XNSim { // 线程相关抽象 using XN_MUTEX = std::mutex; #ifdef XN_WINDOWS using XN_THREAD = std::thread; using XN_THREAD_MUTEX = std::unique_lock; using XN_THREAD_CV = std::condition_variable; #endif #ifdef XN_LINUX using XN_THREAD = pthread_t; using XN_THREAD_MUTEX = pthread_mutex_t; using XN_THREAD_CV = pthread_cond_t; using XN_THREAD_ATTR = pthread_attr_t; using XN_THREAD_SCHED_PARAM = sched_param; #endif FORCEINLINE void XNThreadMutexLock(XN_THREAD_MUTEX *mutex) { #ifdef XN_WINDOWS mutex->lock(); #endif #ifdef XN_LINUX pthread_mutex_lock(mutex); #endif } FORCEINLINE void XNThreadMutexUnlock(XN_THREAD_MUTEX *mutex) { #ifdef XN_WINDOWS mutex->unlock(); #endif #ifdef XN_LINUX pthread_mutex_unlock(mutex); #endif } FORCEINLINE void XNThreadCVWait(XN_THREAD_CV *cv, XN_THREAD_MUTEX *mutex) { #ifdef XN_WINDOWS cv->wait(*mutex); #endif #ifdef XN_LINUX pthread_cond_wait(cv, mutex); #endif } FORCEINLINE void XNThreadCVNotifyOne(XN_THREAD_CV *cv) { #ifdef XN_WINDOWS cv->notify_one(); #endif #ifdef XN_LINUX pthread_cond_signal(cv); #endif } FORCEINLINE void XNThreadCVNotifyAll(XN_THREAD_CV *cv) { #ifdef XN_WINDOWS cv->notify_all(); #endif #ifdef XN_LINUX pthread_cond_broadcast(cv); #endif } FORCEINLINE void XNThreadJoin(XN_THREAD &thread) { #ifdef XN_WINDOWS thread.join(); #endif #ifdef XN_LINUX pthread_join(thread, NULL); #endif } FORCEINLINE void XNThreadDetach(XN_THREAD &thread) { #ifdef XN_WINDOWS thread.detach(); #endif #ifdef XN_LINUX pthread_detach(thread); #endif } FORCEINLINE XN_UINT32 XNThreadGetID() { #ifdef XN_WINDOWS return GetCurrentThreadId(); #endif #ifdef XN_LINUX return pthread_self(); #endif } // 模型周期性回调函数类型别名 using XNCallBack = std::function; // 事件回调函数类型别名 using XNEventCallback = std::function; } // namespace XNSim