108 lines
2.1 KiB
C++

#pragma once
#include <XNGlobalDefine/XNCore_global.h>
#include <any>
#include <condition_variable>
#include <functional>
#include <mutex>
#include <thread>
#ifdef XN_LINUX
#include <pthread.h>
#endif
namespace XNSim {
// 线程相关抽象
using XN_MUTEX = std::mutex;
#ifdef XN_WINDOWS
using XN_THREAD = std::thread;
using XN_THREAD_MUTEX = std::unique_lock<std::mutex>;
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<void()>;
// 事件回调函数类型别名
using XNEventCallback = std::function<void(const std::any &)>;
} // namespace XNSim