跨平台(win和unix)的线程封装类
Posted ostin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跨平台(win和unix)的线程封装类相关的知识,希望对你有一定的参考价值。
- #ifdef WIN32
- #include <Windows.h>
- #include <process.h>
- #else
- #include <pthread.h>
- #endif
- /*
- #ifdef WIN32
- typedef unsigned int(__stdcall *thread_func)(void*);
- #else
- typedef void*(*thread_func)(void*);
- #endif
- */
- class base_thread
- {
- public:
- base_thread();
- virtual ~base_thread();
- bool create();
- void wait();
- virtual void run() = 0;
- #ifdef WIN32
- static unsigned __stdcall thread_func(void* arg);
- #else
- static void* thread_func(void* arg);
- #endif
- protected:
- #ifdef WIN32
- HANDLE m_handle;
- #else
- pthread_t m_thread_t;
- #endif
- };
- #endif
- base_thread::base_thread()
- {
- #ifdef WIN32
- m_handle = NULL;
- #else
- m_thread_t = 0;
- #endif
- }
- base_thread::~base_thread()
- {
- #ifdef WIN32
- if (NULL != m_handle)
- {
- CloseHandle(m_handle);
- }
- m_handle = NULL;
- #else
- m_thread_t = 0;
- #endif
- }
- bool base_thread::create()
- {
- bool ret = false;
- #ifdef WIN32
- m_handle = (HANDLE)_beginthreadex(NULL, 0, thread_func, this, 0, NULL);
- if (NULL != m_handle)
- {
- ret = true;
- }
- #else
- if (0 == pthread_create(&m_thread_t, NULL, thread_func, this))
- {
- ret = true;
- }
- else
- {
- m_thread_t = 0;
- }
- #endif
- return ret;
- }
- void base_thread::wait()
- {
- #ifdef WIN32
- WaitForSingleObject(m_handle, INFINITE);
- if (NULL != m_handle)
- {
- CloseHandle(m_handle);
- }
- m_handle = NULL;
- #else
- pthread_join(m_thread_t, NULL);
- m_thread_t = 0;
- #endif // WIN32
- }
- #ifdef WIN32
- unsigned __stdcall base_thread::thread_func(void* arg)
- #else
- void* base_thread::thread_func(void* arg)
- #endif
- {
- base_thread *pthis = (base_thread*)arg;
- pthis->run();
- return NULL;
- }
封装了一个线程基类,可以在windows和linux下使用,其中run方法是要求继承的子类必须实现的,这个方法相当于线程函数,可以看到,在基类base_thread中,我在线程函数中调用了方法run。wait是用来等待线程安全退出放在主线程中卡住等待的。
以上是关于跨平台(win和unix)的线程封装类的主要内容,如果未能解决你的问题,请参考以下文章
我的C/C++语言学习进阶之旅 通过C++跨平台的预编译宏来区分不同的操作系统:Win32/Win64/Unix/Linux/MacOS/iOS/Android等
我的C/C++语言学习进阶之旅 通过C++跨平台的预编译宏来区分不同的操作系统:Win32/Win64/Unix/Linux/MacOS/iOS/Android等