?? pthread.h
?? glibc 庫, 不僅可以學習使用庫函數(shù),還可以學習函數(shù)的具體實現(xiàn),是提高功力的好資料
?? H
?? 第 1 頁 / 共 3 頁
字號:
??
/* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C 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.1 of the License, or (at your option) any later version. The GNU C 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 the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */#ifndef _PTHREAD_H#define _PTHREAD_H 1#include <features.h>#include <sched.h>#include <time.h>#define __need_sigset_t#include <signal.h>#include <bits/pthreadtypes.h>#include <bits/setjmp.h>#include <bits/wordsize.h>/* Detach state. */enum{ PTHREAD_CREATE_JOINABLE,#define PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_DETACHED#define PTHREAD_CREATE_DETACHED PTHREAD_CREATE_DETACHED};/* Mutex types. */enum{ PTHREAD_MUTEX_TIMED_NP, PTHREAD_MUTEX_RECURSIVE_NP, PTHREAD_MUTEX_ERRORCHECK_NP, PTHREAD_MUTEX_ADAPTIVE_NP#ifdef __USE_UNIX98 , PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_TIMED_NP, PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP, PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP, PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL#endif#ifdef __USE_GNU /* For compatibility. */ , PTHREAD_MUTEX_FAST_NP = PTHREAD_MUTEX_TIMED_NP#endif};#ifdef __USE_GNU/* Robust mutex or not flags. */enum{ PTHREAD_MUTEX_STALLED_NP, PTHREAD_MUTEX_ROBUST_NP};#endif#ifdef __USE_UNIX98/* Mutex protocols. */enum{ PTHREAD_PRIO_NONE, PTHREAD_PRIO_INHERIT, PTHREAD_PRIO_PROTECT};#endif/* Mutex initializers. */#if __WORDSIZE == 64# define PTHREAD_MUTEX_INITIALIZER \ { { 0, 0, 0, 0, 0, 0, { 0, 0 } } }# ifdef __USE_GNU# define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \ { { 0, 0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, 0, { 0, 0 } } }# define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP \ { { 0, 0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP, 0, { 0, 0 } } }# define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP \ { { 0, 0, 0, 0, PTHREAD_MUTEX_ADAPTIVE_NP, 0, { 0, 0 } } }# endif#else# define PTHREAD_MUTEX_INITIALIZER \ { { 0, 0, 0, 0, 0, { 0 } } }# ifdef __USE_GNU# define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \ { { 0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, 0, { 0 } } }# define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP \ { { 0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP, 0, { 0 } } }# define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP \ { { 0, 0, 0, PTHREAD_MUTEX_ADAPTIVE_NP, 0, { 0 } } }# endif#endif/* Read-write lock types. */#if defined __USE_UNIX98 || defined __USE_XOPEN2Kenum{ PTHREAD_RWLOCK_PREFER_READER_NP, PTHREAD_RWLOCK_PREFER_WRITER_NP, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP, PTHREAD_RWLOCK_DEFAULT_NP = PTHREAD_RWLOCK_PREFER_READER_NP};/* Read-write lock initializers. */# if __WORDSIZE == 64# define PTHREAD_RWLOCK_INITIALIZER \ { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }# else# define PTHREAD_RWLOCK_INITIALIZER \ { { 0, 0, 0, 0, 0, 0, 0, 0 } }# endif# ifdef __USE_GNU# if __WORDSIZE == 64# define PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP \ { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP } }# else# define PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP \ { { 0, 0, 0, 0, 0, 0, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP, 0 } }# endif# endif#endif /* Unix98 or XOpen2K *//* Scheduler inheritance. */enum{ PTHREAD_INHERIT_SCHED,#define PTHREAD_INHERIT_SCHED PTHREAD_INHERIT_SCHED PTHREAD_EXPLICIT_SCHED#define PTHREAD_EXPLICIT_SCHED PTHREAD_EXPLICIT_SCHED};/* Scope handling. */enum{ PTHREAD_SCOPE_SYSTEM,#define PTHREAD_SCOPE_SYSTEM PTHREAD_SCOPE_SYSTEM PTHREAD_SCOPE_PROCESS#define PTHREAD_SCOPE_PROCESS PTHREAD_SCOPE_PROCESS};/* Process shared or private flag. */enum{ PTHREAD_PROCESS_PRIVATE,#define PTHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_SHARED#define PTHREAD_PROCESS_SHARED PTHREAD_PROCESS_SHARED};/* Conditional variable handling. */#define PTHREAD_COND_INITIALIZER { { 0, 0, 0, 0, 0, (void *) 0, 0, 0 } }/* Cleanup buffers */struct _pthread_cleanup_buffer{ void (*__routine) (void *); /* Function to call. */ void *__arg; /* Its argument. */ int __canceltype; /* Saved cancellation type. */ struct _pthread_cleanup_buffer *__prev; /* Chaining of cleanup functions. */};/* Cancellation */enum{ PTHREAD_CANCEL_ENABLE,#define PTHREAD_CANCEL_ENABLE PTHREAD_CANCEL_ENABLE PTHREAD_CANCEL_DISABLE#define PTHREAD_CANCEL_DISABLE PTHREAD_CANCEL_DISABLE};enum{ PTHREAD_CANCEL_DEFERRED,#define PTHREAD_CANCEL_DEFERRED PTHREAD_CANCEL_DEFERRED PTHREAD_CANCEL_ASYNCHRONOUS#define PTHREAD_CANCEL_ASYNCHRONOUS PTHREAD_CANCEL_ASYNCHRONOUS};#define PTHREAD_CANCELED ((void *) -1)/* Single execution handling. */#define PTHREAD_ONCE_INIT 0#ifdef __USE_XOPEN2K/* Value returned by 'pthread_barrier_wait' for one of the threads after the required number of threads have called this function. -1 is distinct from 0 and all errno constants */# define PTHREAD_BARRIER_SERIAL_THREAD -1#endif__BEGIN_DECLS/* Create a new thread, starting with execution of START-ROUTINE getting passed ARG. Creation attributed come from ATTR. The new handle is stored in *NEWTHREAD. */extern int pthread_create (pthread_t *__restrict __newthread, __const pthread_attr_t *__restrict __attr, void *(*__start_routine) (void *), void *__restrict __arg) __THROW __nonnull ((1, 3));/* Terminate calling thread. The registered cleanup handlers are called via exception handling so we cannot mark this function with __THROW.*/extern void pthread_exit (void *__retval) __attribute__ ((__noreturn__));/* Make calling thread wait for termination of the thread TH. The exit status of the thread is stored in *THREAD_RETURN, if THREAD_RETURN is not NULL. This function is a cancellation point and therefore not marked with __THROW. */extern int pthread_join (pthread_t __th, void **__thread_return);#ifdef __USE_GNU/* Check whether thread TH has terminated. If yes return the status of the thread in *THREAD_RETURN, if THREAD_RETURN is not NULL. */extern int pthread_tryjoin_np (pthread_t __th, void **__thread_return) __THROW;/* Make calling thread wait for termination of the thread TH, but only until TIMEOUT. The exit status of the thread is stored in *THREAD_RETURN, if THREAD_RETURN is not NULL. This function is a cancellation point and therefore not marked with __THROW. */extern int pthread_timedjoin_np (pthread_t __th, void **__thread_return, __const struct timespec *__abstime);#endif/* Indicate that the thread TH is never to be joined with PTHREAD_JOIN. The resources of TH will therefore be freed immediately when it terminates, instead of waiting for another thread to perform PTHREAD_JOIN on it. */extern int pthread_detach (pthread_t __th) __THROW;/* Obtain the identifier of the current thread. */extern pthread_t pthread_self (void) __THROW __attribute__ ((__const__));/* Compare two thread identifiers. */extern int pthread_equal (pthread_t __thread1, pthread_t __thread2) __THROW;/* Thread attribute handling. *//* Initialize thread attribute *ATTR with default attributes (detachstate is PTHREAD_JOINABLE, scheduling policy is SCHED_OTHER, no user-provided stack). */extern int pthread_attr_init (pthread_attr_t *__attr) __THROW __nonnull ((1));/* Destroy thread attribute *ATTR. */extern int pthread_attr_destroy (pthread_attr_t *__attr) __THROW __nonnull ((1));/* Get detach state attribute. */extern int pthread_attr_getdetachstate (__const pthread_attr_t *__attr, int *__detachstate) __THROW __nonnull ((1, 2));/* Set detach state attribute. */extern int pthread_attr_setdetachstate (pthread_attr_t *__attr, int __detachstate) __THROW __nonnull ((1));/* Get the size of the guard area created for stack overflow protection. */extern int pthread_attr_getguardsize (__const pthread_attr_t *__attr, size_t *__guardsize) __THROW __nonnull ((1, 2));/* Set the size of the guard area created for stack overflow protection. */extern int pthread_attr_setguardsize (pthread_attr_t *__attr, size_t __guardsize) __THROW __nonnull ((1));/* Return in *PARAM the scheduling parameters of *ATTR. */extern int pthread_attr_getschedparam (__const pthread_attr_t *__restrict __attr, struct sched_param *__restrict __param) __THROW __nonnull ((1, 2));/* Set scheduling parameters (priority, etc) in *ATTR according to PARAM. */extern int pthread_attr_setschedparam (pthread_attr_t *__restrict __attr, __const struct sched_param *__restrict __param) __THROW __nonnull ((1, 2));/* Return in *POLICY the scheduling policy of *ATTR. */extern int pthread_attr_getschedpolicy (__const pthread_attr_t *__restrict __attr, int *__restrict __policy) __THROW __nonnull ((1, 2));/* Set scheduling policy in *ATTR according to POLICY. */extern int pthread_attr_setschedpolicy (pthread_attr_t *__attr, int __policy) __THROW __nonnull ((1));/* Return in *INHERIT the scheduling inheritance mode of *ATTR. */extern int pthread_attr_getinheritsched (__const pthread_attr_t *__restrict __attr, int *__restrict __inherit) __THROW __nonnull ((1, 2));/* Set scheduling inheritance mode in *ATTR according to INHERIT. */extern int pthread_attr_setinheritsched (pthread_attr_t *__attr, int __inherit) __THROW __nonnull ((1));/* Return in *SCOPE the scheduling contention scope of *ATTR. */extern int pthread_attr_getscope (__const pthread_attr_t *__restrict __attr, int *__restrict __scope) __THROW __nonnull ((1, 2));/* Set scheduling contention scope in *ATTR according to SCOPE. */extern int pthread_attr_setscope (pthread_attr_t *__attr, int __scope) __THROW __nonnull ((1));/* Return the previously set address for the stack. */extern int pthread_attr_getstackaddr (__const pthread_attr_t *__restrict __attr, void **__restrict __stackaddr) __THROW __nonnull ((1, 2)) __attribute_deprecated__;/* Set the starting address of the stack of the thread to be created. Depending on whether the stack grows up or down the value must either be higher or lower than all the address in the memory block. The minimal size of the block must be PTHREAD_STACK_MIN. */extern int pthread_attr_setstackaddr (pthread_attr_t *__attr, void *__stackaddr) __THROW __nonnull ((1)) __attribute_deprecated__;/* Return the currently used minimal stack size. */extern int pthread_attr_getstacksize (__const pthread_attr_t *__restrict __attr, size_t *__restrict __stacksize) __THROW __nonnull ((1, 2));/* Add information about the minimum stack size needed for the thread to be started. This size must never be less than PTHREAD_STACK_MIN and must also not exceed the system limits. */extern int pthread_attr_setstacksize (pthread_attr_t *__attr, size_t __stacksize) __THROW __nonnull ((1));#ifdef __USE_XOPEN2K/* Return the previously set address for the stack. */extern int pthread_attr_getstack (__const pthread_attr_t *__restrict __attr, void **__restrict __stackaddr, size_t *__restrict __stacksize) __THROW __nonnull ((1, 2, 3));
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -