108 lines
2.1 KiB
C++
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
|