⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spthread.h

📁 同时支持windows和Linux的线程池代码
💻 H
字号:
#ifndef __spthread_hpp__#define __spthread_hpp__#ifndef WIN32

/// pthread#include <pthread.h>#include <unistd.h>typedef void * sp_thread_result_t;typedef pthread_mutex_t sp_thread_mutex_t;typedef pthread_cond_t  sp_thread_cond_t;typedef pthread_t       sp_thread_t;typedef pthread_attr_t  sp_thread_attr_t;#define sp_thread_mutex_init(m,a)   pthread_mutex_init(m,a)#define sp_thread_mutex_destroy(m)  pthread_mutex_destroy(m)#define sp_thread_mutex_lock(m)     pthread_mutex_lock(m)#define sp_thread_mutex_unlock(m)   pthread_mutex_unlock(m)#define sp_thread_cond_init(c,a)    pthread_cond_init(c,a)#define sp_thread_cond_destroy(c)   pthread_cond_destroy(c)#define sp_thread_cond_wait(c,m)    pthread_cond_wait(c,m)#define sp_thread_cond_signal(c)    pthread_cond_signal(c)#define sp_thread_attr_init(a)        pthread_attr_init(a)#define sp_thread_attr_setdetachstate pthread_attr_setdetachstate#define SP_THREAD_CREATE_DETACHED     PTHREAD_CREATE_DETACHED#define sp_thread_self    pthread_self#define sp_thread_create  pthread_create#define SP_THREAD_CALLtypedef sp_thread_result_t ( * sp_thread_func_t )( void * args );#define sp_sleep(x) sleep(x)#else ///////////////////////////////////////////////////////////////////////

// win32 thread#include <winsock2.h>#include <process.h>typedef unsigned sp_thread_t;typedef unsigned sp_thread_result_t;#define SP_THREAD_CALL __stdcalltypedef sp_thread_result_t ( __stdcall * sp_thread_func_t )( void * args );typedef HANDLE  sp_thread_mutex_t;typedef HANDLE  sp_thread_cond_t;typedef DWORD   sp_thread_attr_t;#define SP_THREAD_CREATE_DETACHED 1#define sp_sleep(x) Sleep(1000*x)int sp_thread_mutex_init( sp_thread_mutex_t * mutex, void * attr ){	*mutex = CreateMutex( NULL, FALSE, NULL );	return NULL == * mutex ? GetLastError() : 0;}int sp_thread_mutex_destroy( sp_thread_mutex_t * mutex ){	int ret = CloseHandle( *mutex );	return 0 == ret ? GetLastError() : 0;}int sp_thread_mutex_lock( sp_thread_mutex_t * mutex ){	int ret = WaitForSingleObject( *mutex, INFINITE );	return WAIT_OBJECT_0 == ret ? 0 : GetLastError();}int sp_thread_mutex_unlock( sp_thread_mutex_t * mutex ){	int ret = ReleaseMutex( *mutex );	return 0 != ret ? 0 : GetLastError();}int sp_thread_cond_init( sp_thread_cond_t * cond, void * attr ){	*cond = CreateEvent( NULL, FALSE, FALSE, NULL );	return NULL == *cond ? GetLastError() : 0;}int sp_thread_cond_destroy( sp_thread_cond_t * cond ){	int ret = CloseHandle( *cond );	return 0 == ret ? GetLastError() : 0;}/*Caller MUST be holding the mutex lock; thelock is released and the caller is blocked waitingon 'cond'. When 'cond' is signaled, the mutexis re-acquired before returning to the caller.*/int sp_thread_cond_wait( sp_thread_cond_t * cond, sp_thread_mutex_t * mutex ){	int ret = 0;	sp_thread_mutex_unlock( mutex );	ret = WaitForSingleObject( *cond, INFINITE );	sp_thread_mutex_lock( mutex );	return WAIT_OBJECT_0 == ret ? 0 : GetLastError();}int sp_thread_cond_signal( sp_thread_cond_t * cond ){	int ret = SetEvent( *cond );	return 0 == ret ? GetLastError() : 0;}sp_thread_t sp_thread_self(){	return GetCurrentThreadId();}int sp_thread_attr_init( sp_thread_attr_t * attr ){	*attr = 0;	return 0;}int sp_thread_attr_setdetachstate( sp_thread_attr_t * attr, int detachstate ){	*attr |= detachstate;	return 0;}int sp_thread_create( sp_thread_t * thread, sp_thread_attr_t * attr,		sp_thread_func_t myfunc, void * args ){	// _beginthreadex returns 0 on an error	HANDLE h = (HANDLE)_beginthreadex( NULL, 0, myfunc, args, 0, thread );	return h > 0 ? 0 : GetLastError();}#endif#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -