The Portable Operating System Interface (POSIX) defines an Application Programming Interface (API) for thread programming. Implementations of this interface exist for a large number of UNIX-like operating systems (GNU/Linux, Solaris, FreeBSD, OpenBSD, NetBSD, OS X), as well as for Microsoft Windows and others. Libraries that implement this standard (and functions of this standard) are usually called Pthreads.
To enable the creation of portable multi-threaded programs, the IEEE has defined the IEEE standard 1003.1c. Today an extended version of the standard is used - POSIX 1003.1-2001. The creation and control of threads are achieved by calling the POSIX Threads API.
The software model of pthreads defines:
Pthreads defines a set of types and functions in the C programming language. The header file is pthread.h. Basic functions of the POSIX Threads API:
pthread_t
- thread ID;pthread_attr_t
- list of thread attributes.pthread_create()
- create a new thread;pthread_exit()
- terminate calling thread;pthread_cancel()
- send a cancellation request to a thread;pthread_join()
connect to another thread and wait for its termination;pthread_detach()
- disconnect from the thread;pthread_attr_init()
- initialize the thread attributes;pthread_attr_setdetachstate
, pthread_attr_getdetachstate
- set/get detach state attribute in thread attributes object.pthread_mutex_init()
, pthread_mutex_destroy()
, pthread_mutex_lock()
, pthread_mutex_trylock()
;pthread_cond_init()
, pthread_cond_signal()
, pthread_cond_wait()
.An example illustrating the use of pthreads in C:
#include <pthread.h>
#include <stdio.h>
int count; /* shared data */
int atoi(const char *nptr);
void* perform(void *param); /* thread function */
int main(int argc, char *argv[])
{
pthread_t tid; /* thread ID */
pthread_attr_t attr; /* thread attributes */
if (argc != 2) {
fprintf(stderr,"usage: progtest <integer value>\n");
return -1;
}
if (atoi(argv[1]) < 0) {
fprintf(stderr,"The parameter %d is not positive\n",atoi(argv[1]));
return -1;
}
/* get attribute defaults */
pthread_attr_init(&attr);
/* create a thread */
pthread_create(&tid,&attr,perform,argv[1]);
/* wait for the thread to finish */
pthread_join(tid,NULL);
printf("count = %d\n",count);
}
/* thread function */
void* perform(void *param)
{
int i, upper = atoi(param);
count = 0;
if (upper > 0) {
for (i = 1; i <= upper; i++)
count += i;
}
pthread_exit(0);
}