📄 pthread.h
字号:
/* * POSIX 1003.1-2001 Limits * =========================== * * These limits are normally set in <limits.h>, which is not provided with * pthreads-win32. * * PTHREAD_DESTRUCTOR_ITERATIONS * Maximum number of attempts to destroy * a thread's thread-specific data on * termination (must be at least 4) * * PTHREAD_KEYS_MAX * Maximum number of thread-specific data keys * available per process (must be at least 128) * * PTHREAD_STACK_MIN * Minimum supported stack size for a thread * * PTHREAD_THREADS_MAX * Maximum number of threads supported per * process (must be at least 64). * * SEM_NSEMS_MAX * The maximum number of semaphores a process can have. * (must be at least 256) * * SEM_VALUE_MAX * The maximum value a semaphore can have. * (must be at least 32767) * */#undef _POSIX_THREAD_DESTRUCTOR_ITERATIONS#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4#undef PTHREAD_DESTRUCTOR_ITERATIONS#define PTHREAD_DESTRUCTOR_ITERATIONS _POSIX_THREAD_DESTRUCTOR_ITERATIONS#undef _POSIX_THREAD_KEYS_MAX#define _POSIX_THREAD_KEYS_MAX 128#undef PTHREAD_KEYS_MAX#define PTHREAD_KEYS_MAX _POSIX_THREAD_KEYS_MAX#undef PTHREAD_STACK_MIN#define PTHREAD_STACK_MIN 0#undef _POSIX_THREAD_THREADS_MAX#define _POSIX_THREAD_THREADS_MAX 64 /* Arbitrary value */#undef PTHREAD_THREADS_MAX#define PTHREAD_THREADS_MAX 2019#undef _POSIX_SEM_NSEMS_MAX#define _POSIX_SEM_NSEMS_MAX 256 /* Arbitrary value */#undef SEM_NSEMS_MAX#define SEM_NSEMS_MAX 1024#undef _POSIX_SEM_VALUE_MAX#define _POSIX_SEM_VALUE_MAX 32767#undef SEM_VALUE_MAX#define SEM_VALUE_MAX INT_MAX#if __GNUC__ && ! defined (__declspec)# error Please upgrade your GNU compiler to one that supports __declspec.#endif/* * When building the DLL code, you should define PTW32_BUILD so that * the variables/functions are exported correctly. When using the DLL, * do NOT define PTW32_BUILD, and then the variables/functions will * be imported correctly. */#ifndef PTW32_STATIC_LIB# ifdef PTW32_BUILD# define PTW32_DLLPORT __declspec (dllexport)# else# define PTW32_DLLPORT __declspec (dllimport)# endif#else# define PTW32_DLLPORT#endif/* * The Open Watcom C/C++ compiler uses a non-standard calling convention * that passes function args in registers unless __cdecl is explicitly specified * in exposed function prototypes. * * We force all calls to cdecl even though this could slow Watcom code down * slightly. If you know that the Watcom compiler will be used to build both * the DLL and application, then you can probably define this as a null string. * Remember that pthread.h (this file) is used for both the DLL and application builds. */#define PTW32_CDECL __cdecl#if defined(_UWIN) && PTW32_LEVEL >= PTW32_LEVEL_MAX# include <sys/types.h>#else/* * Generic handle type - intended to extend uniqueness beyond * that available with a simple pointer. It should scale for either * IA-32 or IA-64. */typedef struct { void * p; /* Pointer to actual object */ unsigned int x; /* Extra information - reuse count etc */} ptw32_handle_t;typedef ptw32_handle_t pthread_t;typedef struct pthread_attr_t_ * pthread_attr_t;typedef struct pthread_once_t_ pthread_once_t;typedef struct pthread_key_t_ * pthread_key_t;typedef struct pthread_mutex_t_ * pthread_mutex_t;typedef struct pthread_mutexattr_t_ * pthread_mutexattr_t;typedef struct pthread_cond_t_ * pthread_cond_t;typedef struct pthread_condattr_t_ * pthread_condattr_t;#endiftypedef struct pthread_rwlock_t_ * pthread_rwlock_t;typedef struct pthread_rwlockattr_t_ * pthread_rwlockattr_t;typedef struct pthread_spinlock_t_ * pthread_spinlock_t;typedef struct pthread_barrier_t_ * pthread_barrier_t;typedef struct pthread_barrierattr_t_ * pthread_barrierattr_t;/* * ==================== * ==================== * POSIX Threads * ==================== * ==================== */enum {/* * pthread_attr_{get,set}detachstate */ PTHREAD_CREATE_JOINABLE = 0, /* Default */ PTHREAD_CREATE_DETACHED = 1,/* * pthread_attr_{get,set}inheritsched */ PTHREAD_INHERIT_SCHED = 0, PTHREAD_EXPLICIT_SCHED = 1, /* Default *//* * pthread_{get,set}scope */ PTHREAD_SCOPE_PROCESS = 0, PTHREAD_SCOPE_SYSTEM = 1, /* Default *//* * pthread_setcancelstate paramters */ PTHREAD_CANCEL_ENABLE = 0, /* Default */ PTHREAD_CANCEL_DISABLE = 1,/* * pthread_setcanceltype parameters */ PTHREAD_CANCEL_ASYNCHRONOUS = 0, PTHREAD_CANCEL_DEFERRED = 1, /* Default *//* * pthread_mutexattr_{get,set}pshared * pthread_condattr_{get,set}pshared */ PTHREAD_PROCESS_PRIVATE = 0, PTHREAD_PROCESS_SHARED = 1,/* * pthread_barrier_wait */ PTHREAD_BARRIER_SERIAL_THREAD = -1};/* * ==================== * ==================== * Cancelation * ==================== * ==================== */#define PTHREAD_CANCELED ((void *) -1)/* * ==================== * ==================== * Once Key * ==================== * ==================== */#define PTHREAD_ONCE_INIT { PTW32_FALSE, 0, 0, 0}struct pthread_once_t_{ int done; /* indicates if user function has been executed */ void * lock; int reserved1; int reserved2;};/* * ==================== * ==================== * Object initialisers * ==================== * ==================== */#define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t) -1)#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER ((pthread_mutex_t) -2)#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER ((pthread_mutex_t) -3)/* * Compatibility with LinuxThreads */#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP PTHREAD_RECURSIVE_MUTEX_INITIALIZER#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP PTHREAD_ERRORCHECK_MUTEX_INITIALIZER#define PTHREAD_COND_INITIALIZER ((pthread_cond_t) -1)#define PTHREAD_RWLOCK_INITIALIZER ((pthread_rwlock_t) -1)#define PTHREAD_SPINLOCK_INITIALIZER ((pthread_spinlock_t) -1)/* * Mutex types. */enum{ /* Compatibility with LinuxThreads */ PTHREAD_MUTEX_FAST_NP, PTHREAD_MUTEX_RECURSIVE_NP, PTHREAD_MUTEX_ERRORCHECK_NP, PTHREAD_MUTEX_TIMED_NP = PTHREAD_MUTEX_FAST_NP, PTHREAD_MUTEX_ADAPTIVE_NP = PTHREAD_MUTEX_FAST_NP, /* For compatibility with POSIX */ PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_FAST_NP, PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP, PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP, PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL};typedef struct ptw32_cleanup_t ptw32_cleanup_t;#if defined(_MSC_VER)/* Disable MSVC 'anachronism used' warning */#pragma warning( disable : 4229 )#endiftypedef void (* PTW32_CDECL ptw32_cleanup_callback_t)(void *);#if defined(_MSC_VER)#pragma warning( default : 4229 )#endifstruct ptw32_cleanup_t{ ptw32_cleanup_callback_t routine; void *arg; struct ptw32_cleanup_t *prev;};#ifdef __CLEANUP_SEH /* * WIN32 SEH version of cancel cleanup. */#define pthread_cleanup_push( _rout, _arg ) \ { \ ptw32_cleanup_t _cleanup; \ \ _cleanup.routine = (ptw32_cleanup_callback_t)(_rout); \ _cleanup.arg = (_arg); \ __try \ { \#define pthread_cleanup_pop( _execute ) \ } \ __finally \ { \ if( _execute || AbnormalTermination()) \ { \ (*(_cleanup.routine))( _cleanup.arg ); \ } \ } \ }#else /* __CLEANUP_SEH */#ifdef __CLEANUP_C /* * C implementation of PThreads cancel cleanup */#define pthread_cleanup_push( _rout, _arg ) \ { \ ptw32_cleanup_t _cleanup; \ \ ptw32_push_cleanup( &_cleanup, (ptw32_cleanup_callback_t) (_rout), (_arg) ); \#define pthread_cleanup_pop( _execute ) \ (void) ptw32_pop_cleanup( _execute ); \ }#else /* __CLEANUP_C */#ifdef __CLEANUP_CXX /* * C++ version of cancel cleanup. * - John E. Bossom. */ class PThreadCleanup { /* * PThreadCleanup * * Purpose * This class is a C++ helper class that is * used to implement pthread_cleanup_push/ * pthread_cleanup_pop. * The destructor of this class automatically * pops the pushed cleanup routine regardless * of how the code exits the scope * (i.e. such as by an exception) */ ptw32_cleanup_callback_t cleanUpRout; void * obj; int executeIt; public: PThreadCleanup() : cleanUpRout( 0 ), obj( 0 ), executeIt( 0 ) /* * No cleanup performed */ { } PThreadCleanup( ptw32_cleanup_callback_t routine, void * arg ) : cleanUpRout( routine ), obj( arg ), executeIt( 1 ) /* * Registers a cleanup routine for 'arg' */ { } ~PThreadCleanup() { if ( executeIt && ((void *) cleanUpRout != (void *) 0) ) { (void) (*cleanUpRout)( obj ); } } void execute( int exec ) { executeIt = exec; } }; /* * C++ implementation of PThreads cancel cleanup; * This implementation takes advantage of a helper * class who's destructor automatically calls the * cleanup routine if we exit our scope weirdly */#define pthread_cleanup_push( _rout, _arg ) \ { \ PThreadCleanup cleanup((ptw32_cleanup_callback_t)(_rout), \ (void *) (_arg) );#define pthread_cleanup_pop( _execute ) \ cleanup.execute( _execute ); \ }#else#error ERROR [__FILE__, line __LINE__]: Cleanup type undefined.#endif /* __CLEANUP_CXX */#endif /* __CLEANUP_C */#endif /* __CLEANUP_SEH *//* * =============== * =============== * Methods * =============== * =============== *//* * PThread Attribute Functions */PTW32_DLLPORT int PTW32_CDECL pthread_attr_init (pthread_attr_t * attr);PTW32_DLLPORT int PTW32_CDECL pthread_attr_destroy (pthread_attr_t * attr);PTW32_DLLPORT int PTW32_CDECL pthread_attr_getdetachstate (const pthread_attr_t * attr, int *detachstate);PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstackaddr (const pthread_attr_t * attr, void **stackaddr);PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstacksize (const pthread_attr_t * attr, size_t * stacksize);PTW32_DLLPORT int PTW32_CDECL pthread_attr_setdetachstate (pthread_attr_t * attr, int detachstate);PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstackaddr (pthread_attr_t * attr, void *stackaddr);PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstacksize (pthread_attr_t * attr, size_t stacksize);PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedparam (const pthread_attr_t *attr, struct sched_param *param);PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedparam (pthread_attr_t *attr, const struct sched_param *param);PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedpolicy (pthread_attr_t *, int);PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedpolicy (pthread_attr_t *, int *);PTW32_DLLPORT int PTW32_CDECL pthread_attr_setinheritsched(pthread_attr_t * attr, int inheritsched);PTW32_DLLPORT int PTW32_CDECL pthread_attr_getinheritsched(pthread_attr_t * attr, int * inheritsched);PTW32_DLLPORT int PTW32_CDECL pthread_attr_setscope (pthread_attr_t *, int);PTW32_DLLPORT int PTW32_CDECL pthread_attr_getscope (const pthread_attr_t *,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -