3. POSIX Multithreaded Programming
|
|
The original Pthreads API was defined in the ANSI/IEEE POSIX 1003.1 - 1995 standard. |
Pthreads API can be informally grouped into four major groups: |
– Thread management: Routines that work directly on threads - creating, detaching, joining, etc.
– Mutexes (mutual exclusion): Routines that deal with synchronization. Mutex functions provide for creating, destroying, locking and unlocking mutexes.
– Condition variables: Routines that address communications between threads that share a mutex. This group includes functions to create, destroy, wait and signal based upon specified variable values. Functions to set/query condition variable attributes are also included.
– Synchronization: Routines that manage read/write locks and barriers. |
|
API |
– All identifiers in the threads library begin with pthread_. Some examples are shown below. |
|
Routine Prefix |
Thread management |
pthread_ |
Mutexes |
pthread_mutex_ |
Condition variables |
pthread_cond_ |
Synchronization |
pthread_rwlock_, pthread_barrier_ |
|
|
Compile |
#include <pthread.h>
gcc −Wall −O0 −o <output> file.c −pthread (no −l prefix) |
|
int pthread_create (pthread_t thread,
const pthread _attr _t attr,
void ∗( ∗ start _routine )( void ∗), void arg ); |
|
– creates a new thread with the attributes specified by attr.
– Default attributes are used if attr is NULL.
– On success, stores the thread it into thread
– calls function start_routine(arg) on a separate thread of execution.
– returns zero on success, non-zero on error. |
|
void pthread_exit(void∗ value_ptr); |
|
– called implicitly when thread function exits.
– analogous to exit(). |
|
Example |
#include <pthread.h>
#include <stdio.h>
void *ThreadProc(void *param)
{
int val;
val = (int)param;
printf(“%d Thread is Running!\n", val);
pthread_exit(NULL);
}
int main()
{
pthread_t threads[5];
int i, reault;
for(i=0; i<5; i++){
result = pthread_create(&threads[i], NULL,
ThreadProc, (void *)i);
if (result){
printf(“error code = %d\n", result); exit(-1);
}
}
pthread_exit(NULL);
} |
|
|
|