POSIX Threads
|
|
This article is written like a manual or guidebook. Please help rewrite this article from a neutral point of view. (April 2010) |
|
|
This article's citation style may be unclear. The references used may be made clearer with a different or consistent style of citation, footnoting, or external linking. (April 2010) |
POSIX Threads, usually referred to as Pthreads, is a POSIX standard for threads. The standard, POSIX.1c, Threads extensions (IEEE Std 1003.1c-1995), defines an API for creating and manipulating threads.
Implementations of the API are available on many Unix-like POSIX-conformant operating systems such as FreeBSD, NetBSD, OpenBSD, GNU/Linux, Mac OS X and Solaris. DR-DOS and Microsoft Windows implementations also exist: within the SFU/SUA subsystem which provides a native implementation of a number of POSIX APIs, and also within third-party packages such as pthreads-w32,[1] which implements pthreads on top of existing Windows API.
Contents |
[edit] Contents
Pthreads defines a set of C programming language types, functions and constants. It is implemented with a pthread.h header and a thread library.
There are around 100 Pthreads procedures, all prefixed "pthread_" and they can be categorized into four groups:
- Thread management - creating, joining threads etc.
- Mutexes
- Condition variables
- Synchronization between threads using read/write locks and barriers
The POSIX semaphore API works with POSIX threads but is not part of threads standard, having been defined in the POSIX.1b, Real-time extensions (IEEE Std 1003.1b-1993) standard. Consequently the semaphore procedures are prefixed by "sem_" instead of "pthread_".
Compiling this using the standard GCC compiler requires the use of the command line operator "-pthread" to compile, such that a line to compile might read: "gcc -pthread pthread_program.c".
[edit] Example
An example illustrating the use of Pthreads in C:
#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <assert.h> #define NUM_THREADS 5 void *TaskCode(void *argument) { int tid; tid = *((int *) argument); printf("Hello World! It's me, thread %d!\n", tid); /* optionally: insert more useful stuff here */ return NULL; } int main(void) { pthread_t threads[NUM_THREADS]; int thread_args[NUM_THREADS]; int rc, i; /* create all threads */ for (i=0; i<NUM_THREADS; ++i) { thread_args[i] = i; printf("In main: creating thread %d\n", i); rc = pthread_create(&threads[i], NULL, TaskCode, (void *) &thread_args[i]); assert(0 == rc); } /* wait for all threads to complete */ for (i=0; i<NUM_THREADS; ++i) { rc = pthread_join(threads[i], NULL); assert(0 == rc); } exit(EXIT_SUCCESS); }
This program creates five threads, each executing the function TaskCode that prints the unique number of this thread to standard output. If a programmer wanted the threads to communicate with each other, this would require defining a variable outside of the scope of any of the functions, making it a global variable.
[edit] POSIX Threads for Windows
Windows does not support the pthreads standard natively, therefore the Pthreads-w32 project seeks to provide a portable and open-source implementation. It can be also used to port Unix software (which use pthreads) with little or no modification to the Windows platform.[2] With some additional patches the last version 2.8.0 is compatible with 64-bit Windows systems.[3][4]
Interix environment subsystem available in the Windows Services for UNIX/Subsystem for UNIX-based Applications package provides a native port of the pthreads API, i.e. not mapped on Win32/Win64 API but built directly on the operating system syscall interface.[5]
[edit] See also
- OpenMP
- Native POSIX Thread Library (NPTL)
- DCEThreads
- clone (Linux system call)
- Spurious wakeup
- Thread-local storage
- GNU Portable Threads
- FSU Pthreads
- Grand Central Dispatch (Apple's thread library)
- Beginthread (a subroutine within Windows for creating a new thread and unix thread)
[edit] References
- ^ "Pthread Win-32: Level of standards conformance". 2006-12-22. http://sources.redhat.com/pthreads-win32/conformance.html. Retrieved 2010-08-29.
- ^ Hart, Johnson M. (2004-11-21). "Experiments with the Open Source Pthreads Library and Some Comments". http://world.std.com/~jmhart/opensource.htm. Retrieved 2010-08-29.
- ^ "pthread-win32_x64.zip Source and binary for Pthreads-w32 v2.8.0". 2010-01-26. https://code.google.com/p/libusb-winusb-wip/downloads/detail?name=pthread-win32_x64.zip&can=2&q=. Retrieved 2010-08-29.
- ^ "Forum discussion: pthreads-on-64bit-Windows". 2010-01-26. http://libusb.6.n5.nabble.com/pthreads-on-64bit-Windows-td48i20.html. Retrieved 2010-08-29.
- ^ "Chapter 1: Introduction to Windows Services for UNIX 3.5". http://technet.microsoft.com/en-us/library/bb496994.aspx.
[edit] Further reading
- David R. Butenhof. Programming with POSIX Threads. Addison-Wesley. ISBN 0-201-63392-2.
- Bradford Nichols, Dick Buttlar, Jacqueline Proulx Farell. Pthreads Programming. O'Reilly & Associates. ISBN 1-56592-115-1.
- Charles J. Northrup. Programming with UNIX Threads. John Wiley & Sons. ISBN 0-471-13751-0.
- Kay A. Robbins and Steven Robbins. UNIX Systems Programming. Prentice-Hall. ISBN 0-13-042411-0.
[edit] External links
- Pthreads Tutorial
- C/C++ Tutorial: using Pthreads
- Article "POSIX threads explained" by Daniel Robbins (Gentoo Linux founder)
- Interview "Ten Questions with David Butenhof about Parallel Programming and POSIX Threads" by Michael Suess
- Open Source POSIX Threads for Win32
- The Open Group Base Specifications Issue 6, IEEE Std 1003.1
- Pthreads Presentation at 2007 OSCON (O'Reilly Open Source Convention) by Adrien Lamothe. An overview of Pthreads with current trends.
- Comparing programmability of Open MP and pthreads
|
||||||||||||||||||||||||||||||||||||||