📄 pthread.h
字号:
/* This is an implementation of the threads API of POSIX 1003.1-2001. * * -------------------------------------------------------------------------- * * Pthreads-win32 - POSIX Threads Library for Win32 * Copyright(C) 1998 John E. Bossom * Copyright(C) 1999,2005 Pthreads-win32 contributors * * Contact Email: rpj@callisto.canberra.edu.au * * The current list of contributors is contained * in the file CONTRIBUTORS included with the source * code distribution. The list can also be seen at the * following World Wide Web location: * http://sources.redhat.com/pthreads-win32/contributors.html * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library in the file COPYING.LIB; * if not, write to the Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */#if !defined( PTHREAD_H )#define PTHREAD_H/* * See the README file for an explanation of the pthreads-win32 version * numbering scheme and how the DLL is named etc. */#define PTW32_VERSION 2,7,0,0#define PTW32_VERSION_STRING "2, 7, 0, 0\0"/* There are three implementations of cancel cleanup. * Note that pthread.h is included in both application * compilation units and also internally for the library. * The code here and within the library aims to work * for all reasonable combinations of environments. * * The three implementations are: * * WIN32 SEH * C * C++ * * Please note that exiting a push/pop block via * "return", "exit", "break", or "continue" will * lead to different behaviour amongst applications * depending upon whether the library was built * using SEH, C++, or C. For example, a library built * with SEH will call the cleanup routine, while both * C++ and C built versions will not. *//* * Define defaults for cleanup code. * Note: Unless the build explicitly defines one of the following, then * we default to standard C style cleanup. This style uses setjmp/longjmp * in the cancelation and thread exit implementations and therefore won't * do stack unwinding if linked to applications that have it (e.g. * C++ apps). This is currently consistent with most/all commercial Unix * POSIX threads implementations. */#if !defined( __CLEANUP_SEH ) && !defined( __CLEANUP_CXX ) && !defined( __CLEANUP_C )# define __CLEANUP_C#endif#if defined( __CLEANUP_SEH ) && ( !defined( _MSC_VER ) && !defined(PTW32_RC_MSC))#error ERROR [__FILE__, line __LINE__]: SEH is not supported for this compiler.#endif/* * Stop here if we are being included by the resource compiler. */#ifndef RC_INVOKED#undef PTW32_LEVEL#if defined(_POSIX_SOURCE)#define PTW32_LEVEL 0/* Early POSIX */#endif#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309#undef PTW32_LEVEL#define PTW32_LEVEL 1/* Include 1b, 1c and 1d */#endif#if defined(INCLUDE_NP)#undef PTW32_LEVEL#define PTW32_LEVEL 2/* Include Non-Portable extensions */#endif#define PTW32_LEVEL_MAX 3#if !defined(PTW32_LEVEL)#define PTW32_LEVEL PTW32_LEVEL_MAX/* Include everything */#endif#ifdef _UWIN# define HAVE_STRUCT_TIMESPEC 1# define HAVE_SIGNAL_H 1# undef HAVE_CONFIG_H# pragma comment(lib, "pthread")#endif/* * ------------------------------------------------------------- * * * Module: pthread.h * * Purpose: * Provides an implementation of PThreads based upon the * standard: * * POSIX 1003.1-2001 * and * The Single Unix Specification version 3 * * (these two are equivalent) * * in order to enhance code portability between Windows, * various commercial Unix implementations, and Linux. * * See the ANNOUNCE file for a full list of conforming * routines and defined constants, and a list of missing * routines and constants not defined in this implementation. * * Authors: * There have been many contributors to this library. * The initial implementation was contributed by * John Bossom, and several others have provided major * sections or revisions of parts of the implementation. * Often significant effort has been contributed to * find and fix important bugs and other problems to * improve the reliability of the library, which sometimes * is not reflected in the amount of code which changed as * result. * As much as possible, the contributors are acknowledged * in the ChangeLog file in the source code distribution * where their changes are noted in detail. * * Contributors are listed in the CONTRIBUTORS file. * * As usual, all bouquets go to the contributors, and all * brickbats go to the project maintainer. * * Maintainer: * The code base for this project is coordinated and * eventually pre-tested, packaged, and made available by * * Ross Johnson <rpj@callisto.canberra.edu.au> * * QA Testers: * Ultimately, the library is tested in the real world by * a host of competent and demanding scientists and * engineers who report bugs and/or provide solutions * which are then fixed or incorporated into subsequent * versions of the library. Each time a bug is fixed, a * test case is written to prove the fix and ensure * that later changes to the code don't reintroduce the * same error. The number of test cases is slowly growing * and therefore so is the code reliability. * * Compliance: * See the file ANNOUNCE for the list of implemented * and not-implemented routines and defined options. * Of course, these are all defined is this file as well. * * Web site: * The source code and other information about this library * are available from * * http://sources.redhat.com/pthreads-win32/ * * ------------------------------------------------------------- *//* Try to avoid including windows.h */#if defined(__MINGW32__) && defined(__cplusplus)#define PTW32_INCLUDE_WINDOWS_H#endif#ifdef PTW32_INCLUDE_WINDOWS_H#include <windows.h>#endif#if defined(_MSC_VER) && _MSC_VER < 1300 || defined(__DMC__)/* * VC++6.0 or early compiler's header has no DWORD_PTR type. */typedef unsigned long DWORD_PTR;#endif/* * ----------------- * autoconf switches * ----------------- */#if HAVE_CONFIG_H#include "config.h"#endif /* HAVE_CONFIG_H */#ifndef NEED_FTIME#include <time.h>#else /* NEED_FTIME *//* use native WIN32 time API */#endif /* NEED_FTIME */#if HAVE_SIGNAL_H#include <signal.h>#endif /* HAVE_SIGNAL_H */#include <setjmp.h>#include <limits.h>/* * Boolean values to make us independent of system includes. */enum { PTW32_FALSE = 0, PTW32_TRUE = (! PTW32_FALSE)};/* * This is a duplicate of what is in the autoconf config.h, * which is only used when building the pthread-win32 libraries. */#ifndef PTW32_CONFIG_H# if defined(WINCE)# define NEED_ERRNO# define NEED_SEM# endif# if defined(_UWIN) || defined(__MINGW32__)# define HAVE_MODE_T# endif#endif/* * */#if PTW32_LEVEL >= PTW32_LEVEL_MAX#ifdef NEED_ERRNO#include "need_errno.h"#else#include <errno.h>#endif#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX *//* * Several systems don't define some error numbers. */#ifndef ENOTSUP# define ENOTSUP 48 /* This is the value in Solaris. */#endif#ifndef ETIMEDOUT# define ETIMEDOUT 10060 /* This is the value in winsock.h. */#endif#ifndef ENOSYS# define ENOSYS 140 /* Semi-arbitrary value */#endif#ifndef EDEADLK# ifdef EDEADLOCK# define EDEADLK EDEADLOCK# else# define EDEADLK 36 /* This is the value in MSVC. */# endif#endif#include <sched.h>/* * To avoid including windows.h we define only those things that we * actually need from it. */#ifndef PTW32_INCLUDE_WINDOWS_H#ifndef HANDLE# define PTW32__HANDLE_DEF# define HANDLE void *#endif#ifndef DWORD# define PTW32__DWORD_DEF# define DWORD unsigned long#endif#endif#ifndef HAVE_STRUCT_TIMESPEC#define HAVE_STRUCT_TIMESPEC 1struct timespec { long tv_sec; long tv_nsec;};#endif /* HAVE_STRUCT_TIMESPEC */#ifndef SIG_BLOCK#define SIG_BLOCK 0#endif /* SIG_BLOCK */#ifndef SIG_UNBLOCK #define SIG_UNBLOCK 1#endif /* SIG_UNBLOCK */#ifndef SIG_SETMASK#define SIG_SETMASK 2#endif /* SIG_SETMASK */#ifdef __cplusplusextern "C"{#endif /* __cplusplus *//* * ------------------------------------------------------------- * * POSIX 1003.1-2001 Options * ========================= * * Options are normally set in <unistd.h>, which is not provided * with pthreads-win32. * * For conformance with the Single Unix Specification (version 3), all of the * options below are defined, and have a value of either -1 (not supported) * or 200112L (supported). * * These options can neither be left undefined nor have a value of 0, because * either indicates that sysconf(), which is not implemented, may be used at * runtime to check the status of the option. * * _POSIX_THREADS (== 200112L) * If == 200112L, you can use threads * * _POSIX_THREAD_ATTR_STACKSIZE (== 200112L) * If == 200112L, you can control the size of a thread's * stack * pthread_attr_getstacksize * pthread_attr_setstacksize * * _POSIX_THREAD_ATTR_STACKADDR (== -1) * If == 200112L, you can allocate and control a thread's * stack. If not supported, the following functions * will return ENOSYS, indicating they are not * supported: * pthread_attr_getstackaddr * pthread_attr_setstackaddr * * _POSIX_THREAD_PRIORITY_SCHEDULING (== -1) * If == 200112L, you can use realtime scheduling. * This option indicates that the behaviour of some * implemented functions conforms to the additional TPS * requirements in the standard. E.g. rwlocks favour * writers over readers when threads have equal priority. * * _POSIX_THREAD_PRIO_INHERIT (== -1) * If == 200112L, you can create priority inheritance * mutexes. * pthread_mutexattr_getprotocol + * pthread_mutexattr_setprotocol + * * _POSIX_THREAD_PRIO_PROTECT (== -1) * If == 200112L, you can create priority ceiling mutexes * Indicates the availability of: * pthread_mutex_getprioceiling * pthread_mutex_setprioceiling * pthread_mutexattr_getprioceiling * pthread_mutexattr_getprotocol + * pthread_mutexattr_setprioceiling * pthread_mutexattr_setprotocol + * * _POSIX_THREAD_PROCESS_SHARED (== -1) * If set, you can create mutexes and condition * variables that can be shared with another * process.If set, indicates the availability * of: * pthread_mutexattr_getpshared * pthread_mutexattr_setpshared * pthread_condattr_getpshared * pthread_condattr_setpshared * * _POSIX_THREAD_SAFE_FUNCTIONS (== 200112L) * If == 200112L you can use the special *_r library * functions that provide thread-safe behaviour * * _POSIX_READER_WRITER_LOCKS (== 200112L) * If == 200112L, you can use read/write locks * * _POSIX_SPIN_LOCKS (== 200112L) * If == 200112L, you can use spin locks * * _POSIX_BARRIERS (== 200112L) * If == 200112L, you can use barriers * * + These functions provide both 'inherit' and/or * 'protect' protocol, based upon these macro * settings. * * ------------------------------------------------------------- *//* * POSIX Options */#undef _POSIX_THREADS#define _POSIX_THREADS 200112L#undef _POSIX_READER_WRITER_LOCKS#define _POSIX_READER_WRITER_LOCKS 200112L#undef _POSIX_SPIN_LOCKS#define _POSIX_SPIN_LOCKS 200112L#undef _POSIX_BARRIERS#define _POSIX_BARRIERS 200112L#undef _POSIX_THREAD_SAFE_FUNCTIONS#define _POSIX_THREAD_SAFE_FUNCTIONS 200112L#undef _POSIX_THREAD_ATTR_STACKSIZE#define _POSIX_THREAD_ATTR_STACKSIZE 200112L/* * The following options are not supported */#undef _POSIX_THREAD_ATTR_STACKADDR#define _POSIX_THREAD_ATTR_STACKADDR -1#undef _POSIX_THREAD_PRIO_INHERIT#define _POSIX_THREAD_PRIO_INHERIT -1#undef _POSIX_THREAD_PRIO_PROTECT#define _POSIX_THREAD_PRIO_PROTECT -1/* TPS is not fully supported. */#undef _POSIX_THREAD_PRIORITY_SCHEDULING#define _POSIX_THREAD_PRIORITY_SCHEDULING -1#undef _POSIX_THREAD_PROCESS_SHARED#define _POSIX_THREAD_PROCESS_SHARED -1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -