.\" $OpenBSD: pthreads.3,v 1.4 1999/05/26 00:13:11 d Exp $ .\" David Leonard , 1998. Public domain. .Dd August 17, 1998 .Dt PTHREADS 3 .Os BSD 4 .Sh NAME .Nm pthreads .Nd POSIX 1003.1c thread interface .Sh DESCRIPTION A thread is a flow of control within a process. Each thread represents a minimal amount of state; normally just the cpu state and a signal mask. All other process state (such as memory, file descriptors) is shared among all of the threads in the process. .Pp In .Ox , threads are implemented in a user-level library .Pa ( libc_r ) that replaces the standard C library .Pa ( libc ) . This replacement is currently achieved by specifying the .Fl pthread flag to .Xr cc 1 for each compilation unit, and for linking. (But see the section on .Sx BUGS . ) .Pp The .Dv SIGINFO signal can be sent to a threaded process to have the library show the state of all of its threads. The information is sent to the process' .Pa /dev/tty . .Pp Threads can be in one of these states: .Bl -tag -offset indent -width Dv -compact .It cond_wait Executing .Xr pthread_cond_wait 3 or .Xr pthread_cond_timedwait 3 . .It dead Waiting for resource deallocation by the thread garbage collector. .It deadlock Waiting for a resource held by the thread itself. .It fdlr_wait File descriptor read lock wait. .It fdlw_wait File descriptor write lock wait. .It fdr_wait Executing one of .Xr accept 2 , .Xr read 2 , .Xr readv 2 , .Xr recvfrom 2 , .Xr recvmsg 2 . .It fdw_wait Executing one of .Xr connect 2 , .Xr sendmsg 2 , .Xr sendto 2 , .Xr write 2 , .Xr writev 2 . .It file_wait Executing .Xr flockfile 3 or similar. .It join Executing .Xr pthread_join 3 . .It mutex_wait Executing .Xr pthread_mutex_lock 3 . .It running Scheduled for, or engaged in, program execution. .It select_wait Executing .Xr select 2 . .It sigsuspend Executing .Xr sigsuspend 2 . .It sigwait Executing .Xr sigwait 3 . .It sleep_wait Executing .Xr sleep 3 or .Xr nanosleep 2 . .It spinblock Waiting for a machine-level atomic lock. .It suspended Suspended with .Xr pthread_suspend_np 3 . .It wait_wait Executing .Xr wait4 2 or similar. .El .Ss Scheduling algorithm The scheduling algorithm used by the user-level thread library is roughly as follows: .Bl -enum -compact .It Threads each have a time slice credit which is debited by the actual time the thread spends in running. Freshly scheduled threads are given a time slice credit of 100000 usec. .It Give an incremental priority update to run-enabled threads that have not run since the last time that an incremental priority update was given to them. .It Choose the next run-enabled thread with the highest priority, that became inactive least recently, and has the largest remaining time slice. .El .Pp When all threads are blocked, the process also blocks. When there are no threads remaining, the process terminates with an exit code of zero. .Sh SEE ALSO .Xr pthread_cleanup_pop 3 , .Xr pthread_cleanup_push 3 , .Xr pthread_cond_broadcast 3 , .Xr pthread_cond_destroy 3 , .Xr pthread_cond_init 3 , .Xr pthread_cond_signal 3 , .Xr pthread_cond_timedwait 3 , .Xr pthread_cond_wait 3 , .Xr pthread_create 3 , .Xr pthread_detach 3 , .Xr pthread_equal 3 , .Xr pthread_exit 3 , .Xr pthread_getspecific 3 , .Xr pthread_join 3 , .Xr pthread_key_create 3 , .Xr pthread_key_delete 3 , .Xr pthread_mutex_destroy 3 , .Xr pthread_mutex_init 3 , .Xr pthread_mutex_lock 3 , .Xr pthread_mutex_trylock 3 , .Xr pthread_mutex_unlock 3 , .Xr pthread_once 3 , .Xr pthread_rwlock_destroy 3 , .Xr pthread_rwlock_init 3 , .Xr pthread_rwlock_rdlock 3 , .Xr pthread_rwlock_unlock 3 , .Xr pthread_rwlock_wrlock 3 , .Xr pthread_rwlockattr_destroy 3 , .Xr pthread_rwlockattr_getpshared 3 , .Xr pthread_rwlockattr_init 3 , .Xr pthread_rwlockattr_setpshared 3 , .Xr pthread_self 3 , .Xr pthread_setspecific 3 .Sh STANDARDS The user-level thread library provides functions that conform to ISO/IEC 9945-1 ANSI/IEEE .Pq Dq Tn POSIX Std 1003.1 Second Edition 1996-07-12. .Sh AUTHORS John Birrell .Pa ( jb@freebsd.org ) wrote the majority of the user level thread library. .\" David Leonard did a fair bit too, but is far too modest. .Sh BUGS Having to pass the .Fl pthread flag to .Xr cc 1 for every compilation unit and linking is an awful kludge. Future releases will most likely depreceate this flag, and instead only use .Fl l Ns Pa pthread during linking. .Pp The library contains of a scheduler that uses the process virtual interval timer to pre-empt running threads. This means that using .Xr setitimer 2 to alter the process virtual timer will have undefined effects. The .Dv SIGVTALRM will never be delivered to threads in a process. .Pp Due to the type definition of .Ft fd_set and the internal reliance on .Xr select 2 , threaded processes may be arbitrarily limited in the number of file descriptors that they can collectively have open.