SlideShare a Scribd company logo
POSIX Threads Programming
Lecture-Set-2
Processes and Threads
• In shared memory multiprocessor architectures, such as
SMPs, threads can be used to implement parallelism.
• Historically, hardware vendors have implemented their own
proprietary versions of threads, making portability a concern
for software developers.
• For UNIX systems, a standardized C language threads
programming interface has been specified by the IEEE POSIX
1003.1c standard.
• Implementations that adhere to this standard are referred to
as POSIX threads, or Pthreads.
Processes and Threads
• These notes begin with an introduction to concepts,
motivations, and design considerations for using Pthreads.
• Each of the three major classes of routines in the Pthreads
API are then covered:
– Thread Management
– Mutex Variables
– Condition Variables
What is a Thread?
• Technically, a thread is defined as an independent stream of
instructions that can be scheduled to run as such by the
operating system.
• But what does this mean?
• The concept of a "procedure" that runs independently from
its main program may best describe a thread.
• Imagine a main program (a.out) that contains a number of
procedures.
• Then imagine all of these procedures being able to be
scheduled to run simultaneously and/or independently by the
operating system.
• That would describe a "multi-threaded" program.
• How is this accomplished?
What is a Thread?
• Recall that processes contain information about program
resources and program execution state, including:
– Process ID, process group ID, user ID, and group ID
– Environment
– Working directory.
– Program instructions
– Registers
– Stack
– Heap
– File descriptors
– Signal actions
– Shared libraries
– Inter-process communication tools (such as message
queues, pipes, semaphores, or shared memory).
Unix Process
What is a Thread?
• Threads use, and exist within, the process resources
• scheduled by the operating system and run as independent
entities
• duplicate only the bare essential resources that enable
them to exist as executable code
What is a Thread?
• Independent flow of control
possible because a thread
maintains its own:
– Stack pointer
– Registers
– Scheduling properties (such as
policy or priority)
– Set of pending and blocked
signals
– Thread specific data.
Summary
• In the UNIX environment a thread:
– Exists within a process and uses the process resources
– Has its own independent flow of control as long as its parent
process exists and the OS supports it
– Duplicates only the essential resources it needs to be
independently schedulable
– May share the process resources with other threads that act
equally independently (and dependently)
– Dies if the parent process dies - or something similar
– Is "lightweight" because most of the overhead has already been
accomplished through the creation of its process.
Thread Consequences
• Because threads within the same process share resources:
– Changes made by one thread to shared system resources (such as
closing a file) will be seen by all other threads
– Two pointers having the same value point to the same data
– Reading and writing to the same memory locations is possible
– Therefore requires explicit synchronization by the programmer
What are Pthreads?
• Historically, hardware vendors have implemented their own
proprietary versions of threads
• These implementations differed substantially from each other
• This makes it difficult for programmers to develop portable
threaded applications
• For UNIX systems, a standardized programming interface has
been specified by the IEEE POSIX 1003.1c standard
• Implementations which adhere to this standard are referred to
as POSIX threads, or Pthreads
• Most hardware vendors now offer Pthreads in addition to their
proprietary API's
What are Pthreads?
• Pthreads are defined as a set of C language programming types
and procedure calls
• Implemented with a pthread.h header/include file and a thread
library
• This makes it difficult for programmers to develop portable
threaded applications
• This library may be part of another library, such as libc.
Why Pthreads?
• The primary motivation is to realize potential program
performance gains
• When compared to the cost of creating and managing a process,
a thread can be created with much less OS overhead
• Managing threads requires fewer system resources than
managing processes
• All threads within a process share the same address space
• Inter-thread communication is more efficient and, in many
cases, easier to use than inter-process communication
Example
• The following table compares timing results for the fork()
subroutine and the pthreads_create() subroutine
• Timings reflect 50,000 process/thread creations, units are in
seconds, no optimization flags
Why Pthreads?
• Potential performance gains and practical advantages over non-
threaded applications:
– Overlapping CPU work with I/O
– For example, a program may have sections where it is performing a long
I/O operation
– While one thread is waiting for an I/O system call to complete, CPU
intensive work can be performed by other threads.
• Priority/real-time scheduling
– Tasks which are more important can be scheduled to supersede or
interrupt lower priority tasks.
• Asynchronous event handling
– Tasks which service events of indeterminate frequency and duration can
be interleaved
– For example, a web server can both transfer data from previous requests
and manage the arrival of new requests.
Why Pthreads?
• The primary motivation for considering the use of Pthreads on
an SMP architecture is to achieve optimum performance
• If using the Message Passing Interface (MPI) for on-node
communications, there is potential for greatly improved
performance
• MPI libraries usually implement on-node task communication via
shared memory, which involves at least one memory copy
operation (process to process)
• For Pthreads there is no intermediate memory copy required
due to shared memory space
• There is no data transfer, per se.
• It becomes more of a cache-to-CPU or memory-to-CPU
bandwidth (worst case) situation
• These speeds are much higher.
Example
Parallel Programming
• On modern, multi-cpu machines, pthreads are ideally suited for
parallel programming
• Whatever applies to parallel programming in general, applies to
parallel pthreads programs
Parallel Programming
• There are many considerations for designing parallel programs,
such as:
– What type of parallel programming model to use?
– Problem partitioning
– Load balancing
– Communications
– Data dependencies
– Synchronization and race conditions
– Memory issues
– I/O issues
– Program complexity
– Programmer effort/costs/time
– ...
Parallel Programming
• To take advantage of Pthreads, a program must be able to be
organized into discrete, independent tasks which can execute
concurrently
• For example, if routine1 and routine2 can be interchanged,
interleaved and/or overlapped in real time, they are candidates
for threading.
Parallel Programming
• Programs having the following characteristics may be well suited
for pthreads:
– Work that can be executed, or data that can be operated on, by multiple
tasks simultaneously
– Block for potentially long I/O waits
– Use many CPU cycles in some places but not others
– Must respond to asynchronous events
– Some work is more important than other work (priority interrupts)
Parallel Programming
• Pthreads can also be used for serial applications to emulate
parallel execution
• For most people, the typical web browser runs desktop/laptop
machine with a single CPU
• Many things can "appear" to be happening at the same time
Parallel Programming
• Several common models for threaded programs exist:
• Manager/worker:
– a single thread, the manager, assigns work to other threads, the workers
– Typically, the manager handles all input and parcels out work to the other
tasks
– At least two forms of the manager/worker model are common:
• static worker pool
• dynamic worker pool
Parallel Programming
• Several common models for threaded programs exist:
• Pipeline:
– a task is broken into a series of sub-operations
– each sub-operation is handled in series, but concurrently, by a different
thread
– An automobile assembly line best describes this model
• Peer:
– similar to the manager/worker model, but after the main thread creates
other threads, it participates in the work.
Shared Memory Model
• All threads have access to the same global, shared memory
• Threads also have their own private data
• Programmers are responsible for synchronizing access
(protecting) globally shared data.
Thread-safeness
• Thread-safeness: in a nutshell, refers an application's ability to
execute multiple threads simultaneously without "clobbering"
shared data or creating "race" conditions
• Example: an application creates several threads, each of which
makes a call to the same library routine:
– This library routine accesses/modifies a global structure or
location in memory.
– As each thread calls this routine it is possible that they may
try to modify this global structure/memory location at the
same time.
– If the routine does not employ some sort of synchronization
constructs to prevent data corruption, then it is not thread-
safe.
Thread-safeness
Thread-safeness
• The implication to users of external library routines:
• if you aren't 100% certain the routine is thread-safe, then you
take your chances with problems that could arise.
• Recommendation:
• Be careful if your application uses libraries or other objects that
don't explicitly guarantee thread-safeness.
• When in doubt, assume that they are not thread-safe until
proven otherwise
• This can be done by "serializing" the calls to the uncertain
routine, etc.
The Pthreads API
• The subroutines which comprise the Pthreads API can be informally
grouped into three major classes:
• Thread management:
– Work directly on threads:
– Creating, detaching, joining, etc.
– They include functions to set/query thread attributes (joinable, scheduling etc.)
• Mutexes:
– Deal with synchronization via a "mutex“
– "mutex“ is an abbreviation for "mutual exclusion“
– Mutex functions provide for creating, destroying, locking and unlocking mutexes
– They are also supplemented by mutex attribute functions that set or modify
attributes associated with mutexes.
The Pthreads API
• The subroutines which comprise the Pthreads API can be informally
grouped into three major classes:
• Condition variables:
– Functions that address communications between threads that share a mutex
– They are based upon programmer specified conditions
– This class includes functions to create, destroy, wait and signal based upon
specified variable values
– Functions to set/query condition variable attributes are also included.
• Naming conventions
All identifiers in the threads library begin with pthread_
The Pthreads API
The Pthreads API
• The concept of opaque objects pervades the design of the API
• The basic calls work to create or modify opaque objects
• The opaque objects can be modified by calls to attribute
functions, which deal with opaque attributes
• The Pthreads API contains over 60 subroutines
• We focus on those which are most likely to be immediately
useful to the beginning Pthreads programmer
• For portability, the pthread.h header file should be included in
each source file using the Pthreads library.
The Pthreads API
• To compile using GNU on Linux:
gcc -pthread
• Pthread routines
pthread_create(thread,attr,start_routine,arg)
The Pthreads API
• Initially, your main() program comprises a single, default thread. All
other threads must be explicitly created by the programmer
pthread_create(thread,attr,start_routine,arg)
• pthread_create creates a new thread and makes it executable
• This routine can be called any number of times from anywhere
within your code
Pthread_create
• pthread_create arguments:
– thread:
An opaque, unique identifier for the new thread returned by the subroutine
– attr:
An opaque attribute object that may be used to set thread attributes
You can specify a thread attributes object, or NULL for the default values
– Start_routine:
the C routine that the thread will execute once it is created
– arg:
A single argument that may be passed to start_routine.
It must be passed by reference as a pointer cast of type void.
NULL may be used if no argument is to be passed.
Pthreads
• Once created, threads are peers, and may create other threads
• There is no implied hierarchy or dependency between threads
Pthread Execution
• Question:
After a thread has been created, how do you know when it will be
scheduled to run by the operating system?
• Answer:
Unless you are using the Pthreads scheduling mechanism, it is up to
the implementation and/or operating system to decide where and
when threads will execute.
Robust programs should not depend upon threads executing in a
specific order.
Thread Attributes
• By default, a thread is created with certain attributes
• Some of these attributes can be changed by the programmer via
the thread attribute object
• pthread_attr_init and pthread_attr_destroy are
used to initialize/destroy the thread attribute object
• Other routines are then used to query/set specific attributes in the
thread attribute object
• Some of these attributes will be discussed later
Terminating Threads
• pthread_exit is used to explicitly exit a thread
• Typically, the pthread_exit() routine is called after a thread
has completed its work and is no longer required to exist
• If main() finishes before the threads it has created, and exits
with pthread_exit(), the other threads will continue to execute
• Otherwise, they will be automatically terminated when main()
finishes
• The programmer may optionally specify a termination status, which
is stored as a void pointer for any thread that may join the calling
thread
• Cleanup: the pthread_exit() routine does not close files
• Any files opened inside the thread will remain open after the
thread is terminated
Discussion
• In subroutines that execute to completion normally, you can often
dispense with calling pthread_exit()
• Unless, of course, you want to pass a return code back
• However, in main(), there is a definite problem if main()
completes before the threads it spawned
• If you don't call pthread_exit() explicitly, when main()
completes, the process (and all threads) will be terminated
• By calling pthread_exit()in main(), the process and all of its
threads will be kept alive even though all of the code in main()
has been executed
Example
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 5
void *PrintHello(void *threadid)
{
long tid;
tid = (long)threadid;
printf("Hello World! It's me, thread #%ld!n", tid);
pthread_exit(NULL);
}
Example
int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc;
long t;
for(t=0;t<NUM_THREADS;t++)
{
printf("In main: creating thread %ldn", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t );
if (rc)
{
printf("ERROR; return code from pthread_create() is %dn", rc);
exit(-1);
}
}
pthread_exit(NULL);
}
Example
Output:
In main: creating thread 0
In main: creating thread 1
In main: creating thread 2
In main: creating thread 3
In main: creating thread 4
Hello World! It's me, thread #0!
Hello World! It's me, thread #1!
Hello World! It's me, thread #2!
Hello World! It's me, thread #3!
Hello World! It's me, thread #4!
Passing Arguments to Threads
• The pthread_create() routine permits the programmer to
pass one argument to the thread start routine
• For cases where multiple arguments must be passed:
– create a structure which contains all of the arguments
– then pass a pointer to that structure in the pthread_create() routine.
– All arguments must be passed by reference and cast to (void *)
• Question:
How can you safely pass data to newly created threads, given their
non-deterministic start-up and scheduling?
• ANSWER:
Make sure that all passed data is thread safe - that it can not be
changed by other threads
• The three examples that follow demonstrate what not and what to
do.
Argument Passing Example 1
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 8
char *messages[NUM_THREADS];
void *PrintHello(void *threadid)
{
int *id_ptr, taskid;
sleep(1);
id_ptr = (int *) threadid;
taskid = *id_ptr;
printf("Thread %d: %sn", taskid, messages[taskid]);
pthread_exit(NULL);
}
This code fragment demonstrates how to pass a simple integer to each thread.
The calling thread uses a unique data structure for each thread, insuring that
each thread's argument remains intact throughout the program.
Argument Passing Example 1
int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int *taskids[NUM_THREADS];
int rc, t;
messages[0] = "English: Hello World!";
messages[1] = "French: Bonjour, le monde!";
messages[2] = "Spanish: Hola al mundo";
messages[3] = "Klingon: Nuq neH!";
messages[4] = "German: Guten Tag, Welt!";
messages[5] = "Russian: Zdravstvytye, mir!";
messages[6] = "Japan: Sekai e konnichiwa!";
messages[7] = "Latin: Orbis, te saluto!";
Argument Passing Example 1
// main, continued
for(t=0;t<NUM_THREADS;t++) {
taskids[t] = (int *) malloc(sizeof(int));
*taskids[t] = t;
printf("Creating thread %dn", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *) taskids[t] );
if (rc) {
printf("ERROR; return code from pthread_create() is %dn", rc);
exit(-1);
}
}
pthread_exit(NULL);
}
Argument Passing Example 1 Output
Creating thread 0
Creating thread 1
Creating thread 2
Creating thread 3
Creating thread 4
Creating thread 5
Creating thread 6
Creating thread 7
Thread 0: English: Hello World!
Thread 1: French: Bonjour, le monde!
Thread 2: Spanish: Hola al mundo
Thread 3: Klingon: Nuq neH!
Thread 4: German: Guten Tag, Welt!
Thread 5: Russian: Zdravstvytye, mir!
Thread 6: Japan: Sekai e konnichiwa!
Thread 7: Latin: Orbis, te saluto!
Argument Passing Example 2
/******************************************************************************
* DESCRIPTION:
* A "hello world" Pthreads program which demonstrates another safe way
* to pass arguments to threads during thread creation. In this case,
* a structure is used to pass multiple arguments.
******************************************************************************/
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 8
char *messages[NUM_THREADS];
struct thread_data
{
int thread_id;
int sum;
char *message;
};
struct thread_data thread_data_array[NUM_THREADS];
Argument Passing Example 2
void *PrintHello(void *threadarg)
{
int taskid, sum;
char *hello_msg;
struct thread_data *my_data;
sleep(1);
my_data = (struct thread_data *) threadarg;
taskid = my_data->thread_id;
sum = my_data->sum;
hello_msg = my_data->message;
printf("Thread %d: %s Sum=%dn", taskid, hello_msg, sum);
pthread_exit(NULL);
}
Argument Passing Example 2
int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int *taskids[NUM_THREADS];
int rc, t, sum;
sum=0;
messages[0] = "English: Hello World!";
messages[1] = "French: Bonjour, le monde!";
messages[2] = "Spanish: Hola al mundo";
messages[3] = "Klingon: Nuq neH!";
messages[4] = "German: Guten Tag, Welt!";
messages[5] = "Russian: Zdravstvytye, mir!";
messages[6] = "Japan: Sekai e konnichiwa!";
messages[7] = "Latin: Orbis, te saluto!";
Argument Passing Example 2
// main, continued
for(t=0;t<NUM_THREADS;t++) {
sum = sum + t;
thread_data_array[t].thread_id = t;
thread_data_array[t].sum = sum;
thread_data_array[t].message = messages[t];
printf("Creating thread %dn", t);
rc = pthread_create(&threads[t], NULL, PrintHello,
(void *) &thread_data_array[t] );
if (rc) {
printf("ERROR; return code from pthread_create() is %dn", rc);
exit(-1);
}
}
pthread_exit(NULL);
}
Argument Passing Example 2 Output
Creating thread 0
Creating thread 1
Creating thread 2
Creating thread 3
Creating thread 4
Creating thread 5
Creating thread 6
Creating thread 7
Thread 0: English: Hello World! Sum=0
Thread 1: French: Bonjour, le monde! Sum=1
Thread 2: Spanish: Hola al mundo Sum=3
Thread 3: Klingon: Nuq neH! Sum=6
Thread 4: German: Guten Tag, Welt! Sum=10
Thread 5: Russian: Zdravstvytye, mir! Sum=15
Thread 6: Japan: Sekai e konnichiwa! Sum=21
Thread 7: Latin: Orbis, te saluto! Sum=28
Example 3 - Thread Argument Passing (Incorrect)
/*****************************************************************************
* DESCRIPTION:
* This "hello world" Pthreads program demonstrates an unsafe (incorrect)
* way to pass thread arguments at thread creation. In this case, the
* argument variable is changed by the main thread as it creates new threads.
******************************************************************************/
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 8
void *PrintHello(void *threadid)
{
long taskid;
sleep(1);
taskid = (long) threadid;
printf("Hello from thread %ldn", taskid);
pthread_exit(NULL);
}
Example 3 - Thread Argument Passing (Incorrect)
int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc;
long t;
for(t=0;t<NUM_THREADS;t++) {
printf("Creating thread %ldn", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *) &t);
if (rc) {
printf("ERROR; return code from pthread_create() is %dn", rc);
exit(-1);
}
}
pthread_exit(NULL);
}
Argument Passing Example 3 Output
Creating thread 0
Creating thread 1
Creating thread 2
Creating thread 3
Creating thread 4
Creating thread 5
Creating thread 6
Creating thread 7
Hello from thread 140737488348392
Hello from thread 140737488348392
Hello from thread 140737488348392
Hello from thread 140737488348392
Hello from thread 140737488348392
Hello from thread 140737488348392
Hello from thread 140737488348392
Hello from thread 140737488348392
Compilation
• The pthread.h header file must be the first included file of each
source file using the threads library.
• Otherwise, the -D_THREAD_SAFE compilation flag should be used
Joining and Detaching Threads
• Routines:
• pthread_join(threadid,status)
• pthread_detach(threadid,status)
• pthread_attr_setdetachstate(attr,detachstate)
• pthread_attr_getdetachstate(attr,detachstate)
• The possible attribute states for the last two routines are:
– PTHREAD_CREATE_DETACHED or
– PTHREAD_CREATE_JOINABLE.
Joining
• "Joining" is one way to accomplish synchronization between
threads.
• For example:
Joining
• The pthread_join() subroutine blocks the calling thread until
the specified threadid thread terminates
• The programmer is able to obtain the target thread's termination
return status if it was specified in the target thread's call to
pthread_exit()
• It is a logical error to attempt simultaneous multiple joins on the
same target thread
Joinable or Not?
• When a thread is created, one of its attributes defines whether it is
joinable or detached
• Only threads that are created as joinable can be joined
• If a thread is created as detached, it can never be joined
• The final draft of the POSIX standard specifies that threads should
be created as joinable
• However, not all implementations may follow this.
Joinable or Not?
• To explicitly create a thread as joinable or detached, the attr
argument in the pthread_create() routine is used
• The typical 4 step process is:
1. Declare a pthread attribute variable of the pthread_attr_t
data type
2. Initialize the attribute variable with pthread_attr_init()
3. Set the attribute detached status with
pthread_attr_setdetachstate()
4. When done, free library resources used by the attribute with
pthread_attr_destroy()
Detach
• The pthread_detach()routine can be used to explicitly detach
a thread even though it was created as joinable
• There is no converse routine
• Recommendations:
• If a thread requires joining, consider explicitly creating it as joinable
• This provides portability as not all implementations may create
threads as joinable by default
• If you know in advance that a thread will never need to join with
another thread, consider creating it in a detached state
• Some system resources may be able to be freed.
Example: Pthread Joining
• Example Code - Pthread Joining
• This example demonstrates how to "wait" for thread completions
by using the Pthread join routine.
• Since some implementations of Pthreads may not create threads in
a joinable state, the threads in this example are explicitly created in
a joinable state
Example: Pthread Joining
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 4
void *BusyWork(void *t)
{
int i;
long tid;
double result=0.0;
tid = (long) t;
printf("Thread %ld starting...n",tid);
for (i=0; i<1000000; i++) {
result = result + sin(i) * tan(i);
}
printf("Thread %ld done. Result = %en",tid, result);
pthread_exit((void*) t);
}
Example: Pthread Joining
int main (int argc, char *argv[])
{
pthread_t thread[NUM_THREADS];
pthread_attr_t attr;
int rc;
long t;
void *status;
/* Initialize and set thread detached attribute */
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
for(t=0; t<NUM_THREADS; t++) {
printf("Main: creating thread %ldn", t);
rc = pthread_create(&thread[t], &attr, BusyWork, (void *)t);
if (rc) {
printf("ERROR; return code from pthread_create()
is %dn", rc);
exit(-1);
}
}
Example: Pthread Joining
/* Free attribute and wait for the other threads */
pthread_attr_destroy(&attr);
for(t=0; t<NUM_THREADS; t++) {
rc = pthread_join(thread[t], &status);
if (rc) {
printf("ERROR; return code from pthread_join()
is %dn", rc);
exit(-1);
}
printf("Main: completed join with thread %ld “
”having a status of %ldn",t,(long)status);
}
printf("Main: program completed. Exiting.n");
pthread_exit(NULL);
}
Example: Pthread Joining
Main: creating thread 0
Main: creating thread 1
Thread 0 starting...
Main: creating thread 2
Thread 1 starting...
Main: creating thread 3
Thread 2 starting...
Thread 3 starting...
Thread 1 done. Result = -3.153838e+06
Thread 0 done. Result = -3.153838e+06
Main: completed join with thread 0 having a status of 0
Main: completed join with thread 1 having a status of 1
Thread 3 done. Result = -3.153838e+06
Thread 2 done. Result = -3.153838e+06
Main: completed join with thread 2 having a status of 2
Main: completed join with thread 3 having a status of 3
Main: program completed. Exiting.
Miscellaneous Routines
• pthread_self()
returns the unique, system assigned thread ID of the calling thread
• pthread_equal(thread1,thread2)
compares two thread IDs.
If the two IDs are different 0 is returned, otherwise a non-zero
value is returned
• Note that for both of these routines, the thread identifier objects
are opaque and can not be easily inspected
• Because thread IDs are opaque objects, the C language equivalence
operator == should not be used
– to compare two thread IDs against each other, or
– to compare a single thread ID against another value.
Miscellaneous Routines
• pthread_once(once_control, init_routine)
• pthread_once executes the init_routine exactly once in a
process.
• The first call to this routine by any thread in the process executes
the given init_routine, without parameters.
• Any subsequent call will have no effect.
• The init_routine routine is typically an initialization routine.
• The once_control parameter is a synchronization control
structure that requires initialization prior to calling pthread_once
• For example:
pthread_once_t once_control=PTHREAD_ONCE_INIT;
pthread_yield Subroutine
• Purpose:
Forces the calling thread to relinquish use of its processor
• NOTE: this routine is NOT available on Linux machines and some Solaris
machines. Use sched_yield, from unistd.h, instead.
• Library:
Threads Library (libpthreads.a)
• Syntax:
#include <pthread.h>
void pthread_yield ()
• Description:
The pthread_yield subroutine forces the calling thread to relinquish use of its
processor, and to wait in the run queue before it is scheduled again
If the run queue is empty when the pthread_yield subroutine is called, the calling
thread is immediately rescheduled.
Homework
• Review Questions 4.1 to 4.15 on page 200
• Problem 4.10 on page 202
• Problem 5.3 on page 253
• Problem 5.6 on page 254

More Related Content

What's hot

Inter Process Communication
Inter Process CommunicationInter Process Communication
Inter Process Communication
Adeel Rasheed
 
RTOS - Real Time Operating Systems
RTOS - Real Time Operating SystemsRTOS - Real Time Operating Systems
RTOS - Real Time Operating Systems
Emertxe Information Technologies Pvt Ltd
 
OS - Process Concepts
OS - Process ConceptsOS - Process Concepts
OS - Process Concepts
Mukesh Chinta
 
Multithreading
MultithreadingMultithreading
Multithreading
A B Shinde
 
Threads (operating System)
Threads (operating System)Threads (operating System)
Threads (operating System)
Prakhar Maurya
 
Inter process communication
Inter process communicationInter process communication
Inter process communicationPradeep Kumar TS
 
Kernels and its types
Kernels and its typesKernels and its types
Kernels and its types
ARAVIND18MCS1004
 
Multilevel queue scheduling
Multilevel queue schedulingMultilevel queue scheduling
Multilevel queue scheduling
AditiPawaskar5
 
Introduction to MPI
Introduction to MPI Introduction to MPI
Introduction to MPI
Hanif Durad
 
Process scheduling
Process schedulingProcess scheduling
Process scheduling
Riya Choudhary
 
Operating system 24 mutex locks and semaphores
Operating system 24 mutex locks and semaphoresOperating system 24 mutex locks and semaphores
Operating system 24 mutex locks and semaphores
Vaibhav Khanna
 
Inter process communication using Linux System Calls
Inter process communication using Linux System CallsInter process communication using Linux System Calls
Inter process communication using Linux System Callsjyoti9vssut
 
Operating Systems - "Chapter 5 Process Synchronization"
Operating Systems - "Chapter 5 Process Synchronization"Operating Systems - "Chapter 5 Process Synchronization"
Operating Systems - "Chapter 5 Process Synchronization"
Ra'Fat Al-Msie'deen
 
Shared-Memory Multiprocessors
Shared-Memory MultiprocessorsShared-Memory Multiprocessors
Shared-Memory Multiprocessors
Salvatore La Bua
 
Real-Time Operating Systems
Real-Time Operating SystemsReal-Time Operating Systems
Real-Time Operating Systems
Praveen Penumathsa
 
Process synchronization in Operating Systems
Process synchronization in Operating SystemsProcess synchronization in Operating Systems
Process synchronization in Operating Systems
Ritu Ranjan Shrivastwa
 

What's hot (20)

Inter Process Communication
Inter Process CommunicationInter Process Communication
Inter Process Communication
 
RTOS - Real Time Operating Systems
RTOS - Real Time Operating SystemsRTOS - Real Time Operating Systems
RTOS - Real Time Operating Systems
 
OS - Process Concepts
OS - Process ConceptsOS - Process Concepts
OS - Process Concepts
 
Inter Process Communication
Inter Process CommunicationInter Process Communication
Inter Process Communication
 
Multithreading
MultithreadingMultithreading
Multithreading
 
Threads (operating System)
Threads (operating System)Threads (operating System)
Threads (operating System)
 
P threads
P threadsP threads
P threads
 
Inter process communication
Inter process communicationInter process communication
Inter process communication
 
Kernels and its types
Kernels and its typesKernels and its types
Kernels and its types
 
operating system structure
operating system structureoperating system structure
operating system structure
 
Multilevel queue scheduling
Multilevel queue schedulingMultilevel queue scheduling
Multilevel queue scheduling
 
Introduction to MPI
Introduction to MPI Introduction to MPI
Introduction to MPI
 
Process scheduling
Process schedulingProcess scheduling
Process scheduling
 
Operating system 24 mutex locks and semaphores
Operating system 24 mutex locks and semaphoresOperating system 24 mutex locks and semaphores
Operating system 24 mutex locks and semaphores
 
Inter process communication using Linux System Calls
Inter process communication using Linux System CallsInter process communication using Linux System Calls
Inter process communication using Linux System Calls
 
Operating Systems - "Chapter 5 Process Synchronization"
Operating Systems - "Chapter 5 Process Synchronization"Operating Systems - "Chapter 5 Process Synchronization"
Operating Systems - "Chapter 5 Process Synchronization"
 
Linux Memory Management
Linux Memory ManagementLinux Memory Management
Linux Memory Management
 
Shared-Memory Multiprocessors
Shared-Memory MultiprocessorsShared-Memory Multiprocessors
Shared-Memory Multiprocessors
 
Real-Time Operating Systems
Real-Time Operating SystemsReal-Time Operating Systems
Real-Time Operating Systems
 
Process synchronization in Operating Systems
Process synchronization in Operating SystemsProcess synchronization in Operating Systems
Process synchronization in Operating Systems
 

Viewers also liked

Posix Threads
Posix ThreadsPosix Threads
Posix Threads
Doug Abbott
 
P-Threads
P-ThreadsP-Threads
P-Threads
Bharathwaj_v
 
Posix threads(asha)
Posix threads(asha)Posix threads(asha)
Posix threads(asha)Nagarajan
 
Ch5: Threads (Operating System)
Ch5: Threads (Operating System)Ch5: Threads (Operating System)
Ch5: Threads (Operating System)
Ahmar Hashmi
 
Threads
ThreadsThreads
Threads
Shivam Singh
 
PThreads Vs Win32 Threads
PThreads  Vs  Win32 ThreadsPThreads  Vs  Win32 Threads
PThreads Vs Win32 Threads
Robert Sayegh
 
Lecture 9 -_pthreads-linux_threads
Lecture 9 -_pthreads-linux_threadsLecture 9 -_pthreads-linux_threads
Lecture 9 -_pthreads-linux_threads
Prashant Pawar
 
Creation of threads
Creation of threadsCreation of threads
Creation of threadsmyrajendra
 
Threads
ThreadsThreads
Threads
Sameer Shaik
 
Confronting the Future--Strategic Visions for the 21st Century Public Library
Confronting the Future--Strategic Visions for the 21st Century Public LibraryConfronting the Future--Strategic Visions for the 21st Century Public Library
Confronting the Future--Strategic Visions for the 21st Century Public Library
Marc Gartler
 
Phase1 review ws-intro-2_km&julian
Phase1 review ws-intro-2_km&julianPhase1 review ws-intro-2_km&julian
Phase1 review ws-intro-2_km&julian
International Water Management Institute (IWMI)
 
Concurrent programming in iOS
Concurrent programming in iOSConcurrent programming in iOS
Concurrent programming in iOS
Dongxu Yao
 
Staff study talk/ on search engine & internet in 2008
Staff study talk/ on search engine & internet in 2008Staff study talk/ on search engine & internet in 2008
Staff study talk/ on search engine & internet in 2008
Sujit Chandak
 
Thread dumps
Thread dumpsThread dumps
Thread dumps
Ajit Bhingarkar
 
Basic Multithreading using Posix Threads
Basic Multithreading using Posix ThreadsBasic Multithreading using Posix Threads
Basic Multithreading using Posix Threads
Tushar B Kute
 
Basic Thread Knowledge
Basic Thread KnowledgeBasic Thread Knowledge
Basic Thread Knowledge
Shipra Roy
 
Knowledge Management In The Health Care Industry Antenatal Care From The Pa...
Knowledge Management In The Health Care Industry   Antenatal Care From The Pa...Knowledge Management In The Health Care Industry   Antenatal Care From The Pa...
Knowledge Management In The Health Care Industry Antenatal Care From The Pa...
jessica
 
Learning Java 3 – Threads and Synchronization
Learning Java 3 – Threads and SynchronizationLearning Java 3 – Threads and Synchronization
Learning Java 3 – Threads and Synchronization
caswenson
 
Threads
ThreadsThreads
Java Thread Synchronization
Java Thread SynchronizationJava Thread Synchronization
Java Thread SynchronizationBenj Del Mundo
 

Viewers also liked (20)

Posix Threads
Posix ThreadsPosix Threads
Posix Threads
 
P-Threads
P-ThreadsP-Threads
P-Threads
 
Posix threads(asha)
Posix threads(asha)Posix threads(asha)
Posix threads(asha)
 
Ch5: Threads (Operating System)
Ch5: Threads (Operating System)Ch5: Threads (Operating System)
Ch5: Threads (Operating System)
 
Threads
ThreadsThreads
Threads
 
PThreads Vs Win32 Threads
PThreads  Vs  Win32 ThreadsPThreads  Vs  Win32 Threads
PThreads Vs Win32 Threads
 
Lecture 9 -_pthreads-linux_threads
Lecture 9 -_pthreads-linux_threadsLecture 9 -_pthreads-linux_threads
Lecture 9 -_pthreads-linux_threads
 
Creation of threads
Creation of threadsCreation of threads
Creation of threads
 
Threads
ThreadsThreads
Threads
 
Confronting the Future--Strategic Visions for the 21st Century Public Library
Confronting the Future--Strategic Visions for the 21st Century Public LibraryConfronting the Future--Strategic Visions for the 21st Century Public Library
Confronting the Future--Strategic Visions for the 21st Century Public Library
 
Phase1 review ws-intro-2_km&julian
Phase1 review ws-intro-2_km&julianPhase1 review ws-intro-2_km&julian
Phase1 review ws-intro-2_km&julian
 
Concurrent programming in iOS
Concurrent programming in iOSConcurrent programming in iOS
Concurrent programming in iOS
 
Staff study talk/ on search engine & internet in 2008
Staff study talk/ on search engine & internet in 2008Staff study talk/ on search engine & internet in 2008
Staff study talk/ on search engine & internet in 2008
 
Thread dumps
Thread dumpsThread dumps
Thread dumps
 
Basic Multithreading using Posix Threads
Basic Multithreading using Posix ThreadsBasic Multithreading using Posix Threads
Basic Multithreading using Posix Threads
 
Basic Thread Knowledge
Basic Thread KnowledgeBasic Thread Knowledge
Basic Thread Knowledge
 
Knowledge Management In The Health Care Industry Antenatal Care From The Pa...
Knowledge Management In The Health Care Industry   Antenatal Care From The Pa...Knowledge Management In The Health Care Industry   Antenatal Care From The Pa...
Knowledge Management In The Health Care Industry Antenatal Care From The Pa...
 
Learning Java 3 – Threads and Synchronization
Learning Java 3 – Threads and SynchronizationLearning Java 3 – Threads and Synchronization
Learning Java 3 – Threads and Synchronization
 
Threads
ThreadsThreads
Threads
 
Java Thread Synchronization
Java Thread SynchronizationJava Thread Synchronization
Java Thread Synchronization
 

Similar to Pthread

Operating system 20 threads
Operating system 20 threadsOperating system 20 threads
Operating system 20 threads
Vaibhav Khanna
 
Multithreaded Programming Part- I.pdf
Multithreaded Programming Part- I.pdfMultithreaded Programming Part- I.pdf
Multithreaded Programming Part- I.pdf
Harika Pudugosula
 
Lecture 3- Threads (1).pptx
Lecture 3- Threads (1).pptxLecture 3- Threads (1).pptx
Lecture 3- Threads (1).pptx
Amanuelmergia
 
Module2 MultiThreads.ppt
Module2 MultiThreads.pptModule2 MultiThreads.ppt
Module2 MultiThreads.ppt
shreesha16
 
Operating Systems & Applications
Operating Systems & ApplicationsOperating Systems & Applications
Operating Systems & Applications
Maulen Bale
 
Lecture 3 threads
Lecture 3   threadsLecture 3   threads
Lecture 3 threads
Kumbirai Junior Muzavazi
 
Lecture 3- Threads.pdf
Lecture 3- Threads.pdfLecture 3- Threads.pdf
Lecture 3- Threads.pdf
Amanuelmergia
 
Java Thread & Multithreading
Java Thread & MultithreadingJava Thread & Multithreading
Java Thread & Multithreading
jehan1987
 
Threads
ThreadsThreads
EMBEDDED OS
EMBEDDED OSEMBEDDED OS
EMBEDDED OS
AJAL A J
 
VTU 6th Sem Elective CSE - Module 3 cloud computing
VTU 6th Sem Elective CSE - Module 3 cloud computingVTU 6th Sem Elective CSE - Module 3 cloud computing
VTU 6th Sem Elective CSE - Module 3 cloud computing
Sachin Gowda
 
Epc 3.ppt
Epc 3.pptEpc 3.ppt
Epc 3.ppt
CasmoletJ
 
unit 4.pptx
unit 4.pptxunit 4.pptx
unit 4.pptx
unit 4.pptxunit 4.pptx
Ch04 threads
Ch04 threadsCh04 threads
Ch04 threads
Nazir Ahmed
 
01-MessagePassingFundamentals.ppt
01-MessagePassingFundamentals.ppt01-MessagePassingFundamentals.ppt
01-MessagePassingFundamentals.ppt
HarshitPal37
 
Parallel & Distributed processing
Parallel & Distributed processingParallel & Distributed processing
Parallel & Distributed processing
Syed Zaid Irshad
 
W-9.pptx
W-9.pptxW-9.pptx
W-9.pptx
alianwarr
 
Os concepts
Os conceptsOs concepts
Os concepts
Sudheesh P Enathu
 

Similar to Pthread (20)

Operating system 20 threads
Operating system 20 threadsOperating system 20 threads
Operating system 20 threads
 
Wiki 2
Wiki 2Wiki 2
Wiki 2
 
Multithreaded Programming Part- I.pdf
Multithreaded Programming Part- I.pdfMultithreaded Programming Part- I.pdf
Multithreaded Programming Part- I.pdf
 
Lecture 3- Threads (1).pptx
Lecture 3- Threads (1).pptxLecture 3- Threads (1).pptx
Lecture 3- Threads (1).pptx
 
Module2 MultiThreads.ppt
Module2 MultiThreads.pptModule2 MultiThreads.ppt
Module2 MultiThreads.ppt
 
Operating Systems & Applications
Operating Systems & ApplicationsOperating Systems & Applications
Operating Systems & Applications
 
Lecture 3 threads
Lecture 3   threadsLecture 3   threads
Lecture 3 threads
 
Lecture 3- Threads.pdf
Lecture 3- Threads.pdfLecture 3- Threads.pdf
Lecture 3- Threads.pdf
 
Java Thread & Multithreading
Java Thread & MultithreadingJava Thread & Multithreading
Java Thread & Multithreading
 
Threads
ThreadsThreads
Threads
 
EMBEDDED OS
EMBEDDED OSEMBEDDED OS
EMBEDDED OS
 
VTU 6th Sem Elective CSE - Module 3 cloud computing
VTU 6th Sem Elective CSE - Module 3 cloud computingVTU 6th Sem Elective CSE - Module 3 cloud computing
VTU 6th Sem Elective CSE - Module 3 cloud computing
 
Epc 3.ppt
Epc 3.pptEpc 3.ppt
Epc 3.ppt
 
unit 4.pptx
unit 4.pptxunit 4.pptx
unit 4.pptx
 
unit 4.pptx
unit 4.pptxunit 4.pptx
unit 4.pptx
 
Ch04 threads
Ch04 threadsCh04 threads
Ch04 threads
 
01-MessagePassingFundamentals.ppt
01-MessagePassingFundamentals.ppt01-MessagePassingFundamentals.ppt
01-MessagePassingFundamentals.ppt
 
Parallel & Distributed processing
Parallel & Distributed processingParallel & Distributed processing
Parallel & Distributed processing
 
W-9.pptx
W-9.pptxW-9.pptx
W-9.pptx
 
Os concepts
Os conceptsOs concepts
Os concepts
 

More from Gopi Saiteja

Trees gt(1)
Trees gt(1)Trees gt(1)
Trees gt(1)
Gopi Saiteja
 
Topic11 sortingandsearching
Topic11 sortingandsearchingTopic11 sortingandsearching
Topic11 sortingandsearching
Gopi Saiteja
 
Heapsort
HeapsortHeapsort
Heapsort
Gopi Saiteja
 
Hashing gt1
Hashing gt1Hashing gt1
Hashing gt1
Gopi Saiteja
 
Ee693 sept2014quizgt2
Ee693 sept2014quizgt2Ee693 sept2014quizgt2
Ee693 sept2014quizgt2
Gopi Saiteja
 
Ee693 sept2014quizgt1
Ee693 sept2014quizgt1Ee693 sept2014quizgt1
Ee693 sept2014quizgt1
Gopi Saiteja
 
Ee693 sept2014quiz1
Ee693 sept2014quiz1Ee693 sept2014quiz1
Ee693 sept2014quiz1
Gopi Saiteja
 
Ee693 sept2014midsem
Ee693 sept2014midsemEe693 sept2014midsem
Ee693 sept2014midsem
Gopi Saiteja
 
Ee693 questionshomework
Ee693 questionshomeworkEe693 questionshomework
Ee693 questionshomework
Gopi Saiteja
 
Dynamic programming
Dynamic programmingDynamic programming
Dynamic programming
Gopi Saiteja
 
Cs105 l15-bucket radix
Cs105 l15-bucket radixCs105 l15-bucket radix
Cs105 l15-bucket radix
Gopi Saiteja
 
Chapter11 sorting algorithmsefficiency
Chapter11 sorting algorithmsefficiencyChapter11 sorting algorithmsefficiency
Chapter11 sorting algorithmsefficiency
Gopi Saiteja
 
Answers withexplanations
Answers withexplanationsAnswers withexplanations
Answers withexplanations
Gopi Saiteja
 
Sorting
SortingSorting
Sorting
Gopi Saiteja
 
Solution(1)
Solution(1)Solution(1)
Solution(1)
Gopi Saiteja
 
Open mp
Open mpOpen mp
Open mp
Gopi Saiteja
 
Introduction
IntroductionIntroduction
Introduction
Gopi Saiteja
 
Cuda
CudaCuda
Vector space interpretation_of_random_variables
Vector space interpretation_of_random_variablesVector space interpretation_of_random_variables
Vector space interpretation_of_random_variables
Gopi Saiteja
 
Statistical signal processing(1)
Statistical signal processing(1)Statistical signal processing(1)
Statistical signal processing(1)
Gopi Saiteja
 

More from Gopi Saiteja (20)

Trees gt(1)
Trees gt(1)Trees gt(1)
Trees gt(1)
 
Topic11 sortingandsearching
Topic11 sortingandsearchingTopic11 sortingandsearching
Topic11 sortingandsearching
 
Heapsort
HeapsortHeapsort
Heapsort
 
Hashing gt1
Hashing gt1Hashing gt1
Hashing gt1
 
Ee693 sept2014quizgt2
Ee693 sept2014quizgt2Ee693 sept2014quizgt2
Ee693 sept2014quizgt2
 
Ee693 sept2014quizgt1
Ee693 sept2014quizgt1Ee693 sept2014quizgt1
Ee693 sept2014quizgt1
 
Ee693 sept2014quiz1
Ee693 sept2014quiz1Ee693 sept2014quiz1
Ee693 sept2014quiz1
 
Ee693 sept2014midsem
Ee693 sept2014midsemEe693 sept2014midsem
Ee693 sept2014midsem
 
Ee693 questionshomework
Ee693 questionshomeworkEe693 questionshomework
Ee693 questionshomework
 
Dynamic programming
Dynamic programmingDynamic programming
Dynamic programming
 
Cs105 l15-bucket radix
Cs105 l15-bucket radixCs105 l15-bucket radix
Cs105 l15-bucket radix
 
Chapter11 sorting algorithmsefficiency
Chapter11 sorting algorithmsefficiencyChapter11 sorting algorithmsefficiency
Chapter11 sorting algorithmsefficiency
 
Answers withexplanations
Answers withexplanationsAnswers withexplanations
Answers withexplanations
 
Sorting
SortingSorting
Sorting
 
Solution(1)
Solution(1)Solution(1)
Solution(1)
 
Open mp
Open mpOpen mp
Open mp
 
Introduction
IntroductionIntroduction
Introduction
 
Cuda
CudaCuda
Cuda
 
Vector space interpretation_of_random_variables
Vector space interpretation_of_random_variablesVector space interpretation_of_random_variables
Vector space interpretation_of_random_variables
 
Statistical signal processing(1)
Statistical signal processing(1)Statistical signal processing(1)
Statistical signal processing(1)
 

Recently uploaded

Planning Of Procurement o different goods and services
Planning Of Procurement o different goods and servicesPlanning Of Procurement o different goods and services
Planning Of Procurement o different goods and services
JoytuBarua2
 
Standard Reomte Control Interface - Neometrix
Standard Reomte Control Interface - NeometrixStandard Reomte Control Interface - Neometrix
Standard Reomte Control Interface - Neometrix
Neometrix_Engineering_Pvt_Ltd
 
HYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generationHYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generation
Robbie Edward Sayers
 
MCQ Soil mechanics questions (Soil shear strength).pdf
MCQ Soil mechanics questions (Soil shear strength).pdfMCQ Soil mechanics questions (Soil shear strength).pdf
MCQ Soil mechanics questions (Soil shear strength).pdf
Osamah Alsalih
 
The Benefits and Techniques of Trenchless Pipe Repair.pdf
The Benefits and Techniques of Trenchless Pipe Repair.pdfThe Benefits and Techniques of Trenchless Pipe Repair.pdf
The Benefits and Techniques of Trenchless Pipe Repair.pdf
Pipe Restoration Solutions
 
CME397 Surface Engineering- Professional Elective
CME397 Surface Engineering- Professional ElectiveCME397 Surface Engineering- Professional Elective
CME397 Surface Engineering- Professional Elective
karthi keyan
 
Student information management system project report ii.pdf
Student information management system project report ii.pdfStudent information management system project report ii.pdf
Student information management system project report ii.pdf
Kamal Acharya
 
TECHNICAL TRAINING MANUAL GENERAL FAMILIARIZATION COURSE
TECHNICAL TRAINING MANUAL   GENERAL FAMILIARIZATION COURSETECHNICAL TRAINING MANUAL   GENERAL FAMILIARIZATION COURSE
TECHNICAL TRAINING MANUAL GENERAL FAMILIARIZATION COURSE
DuvanRamosGarzon1
 
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
Amil Baba Dawood bangali
 
Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...
Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...
Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...
AJAYKUMARPUND1
 
J.Yang, ICLR 2024, MLILAB, KAIST AI.pdf
J.Yang,  ICLR 2024, MLILAB, KAIST AI.pdfJ.Yang,  ICLR 2024, MLILAB, KAIST AI.pdf
J.Yang, ICLR 2024, MLILAB, KAIST AI.pdf
MLILAB
 
Top 10 Oil and Gas Projects in Saudi Arabia 2024.pdf
Top 10 Oil and Gas Projects in Saudi Arabia 2024.pdfTop 10 Oil and Gas Projects in Saudi Arabia 2024.pdf
Top 10 Oil and Gas Projects in Saudi Arabia 2024.pdf
Teleport Manpower Consultant
 
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
Dr.Costas Sachpazis
 
Automobile Management System Project Report.pdf
Automobile Management System Project Report.pdfAutomobile Management System Project Report.pdf
Automobile Management System Project Report.pdf
Kamal Acharya
 
road safety engineering r s e unit 3.pdf
road safety engineering  r s e unit 3.pdfroad safety engineering  r s e unit 3.pdf
road safety engineering r s e unit 3.pdf
VENKATESHvenky89705
 
Immunizing Image Classifiers Against Localized Adversary Attacks
Immunizing Image Classifiers Against Localized Adversary AttacksImmunizing Image Classifiers Against Localized Adversary Attacks
Immunizing Image Classifiers Against Localized Adversary Attacks
gerogepatton
 
Architectural Portfolio Sean Lockwood
Architectural Portfolio Sean LockwoodArchitectural Portfolio Sean Lockwood
Architectural Portfolio Sean Lockwood
seandesed
 
Vaccine management system project report documentation..pdf
Vaccine management system project report documentation..pdfVaccine management system project report documentation..pdf
Vaccine management system project report documentation..pdf
Kamal Acharya
 
Final project report on grocery store management system..pdf
Final project report on grocery store management system..pdfFinal project report on grocery store management system..pdf
Final project report on grocery store management system..pdf
Kamal Acharya
 
Quality defects in TMT Bars, Possible causes and Potential Solutions.
Quality defects in TMT Bars, Possible causes and Potential Solutions.Quality defects in TMT Bars, Possible causes and Potential Solutions.
Quality defects in TMT Bars, Possible causes and Potential Solutions.
PrashantGoswami42
 

Recently uploaded (20)

Planning Of Procurement o different goods and services
Planning Of Procurement o different goods and servicesPlanning Of Procurement o different goods and services
Planning Of Procurement o different goods and services
 
Standard Reomte Control Interface - Neometrix
Standard Reomte Control Interface - NeometrixStandard Reomte Control Interface - Neometrix
Standard Reomte Control Interface - Neometrix
 
HYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generationHYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generation
 
MCQ Soil mechanics questions (Soil shear strength).pdf
MCQ Soil mechanics questions (Soil shear strength).pdfMCQ Soil mechanics questions (Soil shear strength).pdf
MCQ Soil mechanics questions (Soil shear strength).pdf
 
The Benefits and Techniques of Trenchless Pipe Repair.pdf
The Benefits and Techniques of Trenchless Pipe Repair.pdfThe Benefits and Techniques of Trenchless Pipe Repair.pdf
The Benefits and Techniques of Trenchless Pipe Repair.pdf
 
CME397 Surface Engineering- Professional Elective
CME397 Surface Engineering- Professional ElectiveCME397 Surface Engineering- Professional Elective
CME397 Surface Engineering- Professional Elective
 
Student information management system project report ii.pdf
Student information management system project report ii.pdfStudent information management system project report ii.pdf
Student information management system project report ii.pdf
 
TECHNICAL TRAINING MANUAL GENERAL FAMILIARIZATION COURSE
TECHNICAL TRAINING MANUAL   GENERAL FAMILIARIZATION COURSETECHNICAL TRAINING MANUAL   GENERAL FAMILIARIZATION COURSE
TECHNICAL TRAINING MANUAL GENERAL FAMILIARIZATION COURSE
 
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
 
Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...
Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...
Pile Foundation by Venkatesh Taduvai (Sub Geotechnical Engineering II)-conver...
 
J.Yang, ICLR 2024, MLILAB, KAIST AI.pdf
J.Yang,  ICLR 2024, MLILAB, KAIST AI.pdfJ.Yang,  ICLR 2024, MLILAB, KAIST AI.pdf
J.Yang, ICLR 2024, MLILAB, KAIST AI.pdf
 
Top 10 Oil and Gas Projects in Saudi Arabia 2024.pdf
Top 10 Oil and Gas Projects in Saudi Arabia 2024.pdfTop 10 Oil and Gas Projects in Saudi Arabia 2024.pdf
Top 10 Oil and Gas Projects in Saudi Arabia 2024.pdf
 
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
 
Automobile Management System Project Report.pdf
Automobile Management System Project Report.pdfAutomobile Management System Project Report.pdf
Automobile Management System Project Report.pdf
 
road safety engineering r s e unit 3.pdf
road safety engineering  r s e unit 3.pdfroad safety engineering  r s e unit 3.pdf
road safety engineering r s e unit 3.pdf
 
Immunizing Image Classifiers Against Localized Adversary Attacks
Immunizing Image Classifiers Against Localized Adversary AttacksImmunizing Image Classifiers Against Localized Adversary Attacks
Immunizing Image Classifiers Against Localized Adversary Attacks
 
Architectural Portfolio Sean Lockwood
Architectural Portfolio Sean LockwoodArchitectural Portfolio Sean Lockwood
Architectural Portfolio Sean Lockwood
 
Vaccine management system project report documentation..pdf
Vaccine management system project report documentation..pdfVaccine management system project report documentation..pdf
Vaccine management system project report documentation..pdf
 
Final project report on grocery store management system..pdf
Final project report on grocery store management system..pdfFinal project report on grocery store management system..pdf
Final project report on grocery store management system..pdf
 
Quality defects in TMT Bars, Possible causes and Potential Solutions.
Quality defects in TMT Bars, Possible causes and Potential Solutions.Quality defects in TMT Bars, Possible causes and Potential Solutions.
Quality defects in TMT Bars, Possible causes and Potential Solutions.
 

Pthread

  • 2. Processes and Threads • In shared memory multiprocessor architectures, such as SMPs, threads can be used to implement parallelism. • Historically, hardware vendors have implemented their own proprietary versions of threads, making portability a concern for software developers. • For UNIX systems, a standardized C language threads programming interface has been specified by the IEEE POSIX 1003.1c standard. • Implementations that adhere to this standard are referred to as POSIX threads, or Pthreads.
  • 3. Processes and Threads • These notes begin with an introduction to concepts, motivations, and design considerations for using Pthreads. • Each of the three major classes of routines in the Pthreads API are then covered: – Thread Management – Mutex Variables – Condition Variables
  • 4. What is a Thread? • Technically, a thread is defined as an independent stream of instructions that can be scheduled to run as such by the operating system. • But what does this mean? • The concept of a "procedure" that runs independently from its main program may best describe a thread. • Imagine a main program (a.out) that contains a number of procedures. • Then imagine all of these procedures being able to be scheduled to run simultaneously and/or independently by the operating system. • That would describe a "multi-threaded" program. • How is this accomplished?
  • 5. What is a Thread? • Recall that processes contain information about program resources and program execution state, including: – Process ID, process group ID, user ID, and group ID – Environment – Working directory. – Program instructions – Registers – Stack – Heap – File descriptors – Signal actions – Shared libraries – Inter-process communication tools (such as message queues, pipes, semaphores, or shared memory).
  • 7. What is a Thread? • Threads use, and exist within, the process resources • scheduled by the operating system and run as independent entities • duplicate only the bare essential resources that enable them to exist as executable code
  • 8. What is a Thread? • Independent flow of control possible because a thread maintains its own: – Stack pointer – Registers – Scheduling properties (such as policy or priority) – Set of pending and blocked signals – Thread specific data.
  • 9. Summary • In the UNIX environment a thread: – Exists within a process and uses the process resources – Has its own independent flow of control as long as its parent process exists and the OS supports it – Duplicates only the essential resources it needs to be independently schedulable – May share the process resources with other threads that act equally independently (and dependently) – Dies if the parent process dies - or something similar – Is "lightweight" because most of the overhead has already been accomplished through the creation of its process.
  • 10. Thread Consequences • Because threads within the same process share resources: – Changes made by one thread to shared system resources (such as closing a file) will be seen by all other threads – Two pointers having the same value point to the same data – Reading and writing to the same memory locations is possible – Therefore requires explicit synchronization by the programmer
  • 11. What are Pthreads? • Historically, hardware vendors have implemented their own proprietary versions of threads • These implementations differed substantially from each other • This makes it difficult for programmers to develop portable threaded applications • For UNIX systems, a standardized programming interface has been specified by the IEEE POSIX 1003.1c standard • Implementations which adhere to this standard are referred to as POSIX threads, or Pthreads • Most hardware vendors now offer Pthreads in addition to their proprietary API's
  • 12. What are Pthreads? • Pthreads are defined as a set of C language programming types and procedure calls • Implemented with a pthread.h header/include file and a thread library • This makes it difficult for programmers to develop portable threaded applications • This library may be part of another library, such as libc.
  • 13. Why Pthreads? • The primary motivation is to realize potential program performance gains • When compared to the cost of creating and managing a process, a thread can be created with much less OS overhead • Managing threads requires fewer system resources than managing processes • All threads within a process share the same address space • Inter-thread communication is more efficient and, in many cases, easier to use than inter-process communication
  • 14. Example • The following table compares timing results for the fork() subroutine and the pthreads_create() subroutine • Timings reflect 50,000 process/thread creations, units are in seconds, no optimization flags
  • 15. Why Pthreads? • Potential performance gains and practical advantages over non- threaded applications: – Overlapping CPU work with I/O – For example, a program may have sections where it is performing a long I/O operation – While one thread is waiting for an I/O system call to complete, CPU intensive work can be performed by other threads. • Priority/real-time scheduling – Tasks which are more important can be scheduled to supersede or interrupt lower priority tasks. • Asynchronous event handling – Tasks which service events of indeterminate frequency and duration can be interleaved – For example, a web server can both transfer data from previous requests and manage the arrival of new requests.
  • 16. Why Pthreads? • The primary motivation for considering the use of Pthreads on an SMP architecture is to achieve optimum performance • If using the Message Passing Interface (MPI) for on-node communications, there is potential for greatly improved performance • MPI libraries usually implement on-node task communication via shared memory, which involves at least one memory copy operation (process to process) • For Pthreads there is no intermediate memory copy required due to shared memory space • There is no data transfer, per se. • It becomes more of a cache-to-CPU or memory-to-CPU bandwidth (worst case) situation • These speeds are much higher.
  • 18. Parallel Programming • On modern, multi-cpu machines, pthreads are ideally suited for parallel programming • Whatever applies to parallel programming in general, applies to parallel pthreads programs
  • 19. Parallel Programming • There are many considerations for designing parallel programs, such as: – What type of parallel programming model to use? – Problem partitioning – Load balancing – Communications – Data dependencies – Synchronization and race conditions – Memory issues – I/O issues – Program complexity – Programmer effort/costs/time – ...
  • 20. Parallel Programming • To take advantage of Pthreads, a program must be able to be organized into discrete, independent tasks which can execute concurrently • For example, if routine1 and routine2 can be interchanged, interleaved and/or overlapped in real time, they are candidates for threading.
  • 21. Parallel Programming • Programs having the following characteristics may be well suited for pthreads: – Work that can be executed, or data that can be operated on, by multiple tasks simultaneously – Block for potentially long I/O waits – Use many CPU cycles in some places but not others – Must respond to asynchronous events – Some work is more important than other work (priority interrupts)
  • 22. Parallel Programming • Pthreads can also be used for serial applications to emulate parallel execution • For most people, the typical web browser runs desktop/laptop machine with a single CPU • Many things can "appear" to be happening at the same time
  • 23. Parallel Programming • Several common models for threaded programs exist: • Manager/worker: – a single thread, the manager, assigns work to other threads, the workers – Typically, the manager handles all input and parcels out work to the other tasks – At least two forms of the manager/worker model are common: • static worker pool • dynamic worker pool
  • 24. Parallel Programming • Several common models for threaded programs exist: • Pipeline: – a task is broken into a series of sub-operations – each sub-operation is handled in series, but concurrently, by a different thread – An automobile assembly line best describes this model • Peer: – similar to the manager/worker model, but after the main thread creates other threads, it participates in the work.
  • 25. Shared Memory Model • All threads have access to the same global, shared memory • Threads also have their own private data • Programmers are responsible for synchronizing access (protecting) globally shared data.
  • 26. Thread-safeness • Thread-safeness: in a nutshell, refers an application's ability to execute multiple threads simultaneously without "clobbering" shared data or creating "race" conditions • Example: an application creates several threads, each of which makes a call to the same library routine: – This library routine accesses/modifies a global structure or location in memory. – As each thread calls this routine it is possible that they may try to modify this global structure/memory location at the same time. – If the routine does not employ some sort of synchronization constructs to prevent data corruption, then it is not thread- safe.
  • 28. Thread-safeness • The implication to users of external library routines: • if you aren't 100% certain the routine is thread-safe, then you take your chances with problems that could arise. • Recommendation: • Be careful if your application uses libraries or other objects that don't explicitly guarantee thread-safeness. • When in doubt, assume that they are not thread-safe until proven otherwise • This can be done by "serializing" the calls to the uncertain routine, etc.
  • 29. The Pthreads API • The subroutines which comprise the Pthreads API can be informally grouped into three major classes: • Thread management: – Work directly on threads: – Creating, detaching, joining, etc. – They include functions to set/query thread attributes (joinable, scheduling etc.) • Mutexes: – Deal with synchronization via a "mutex“ – "mutex“ is an abbreviation for "mutual exclusion“ – Mutex functions provide for creating, destroying, locking and unlocking mutexes – They are also supplemented by mutex attribute functions that set or modify attributes associated with mutexes.
  • 30. The Pthreads API • The subroutines which comprise the Pthreads API can be informally grouped into three major classes: • Condition variables: – Functions that address communications between threads that share a mutex – They are based upon programmer specified conditions – This class includes functions to create, destroy, wait and signal based upon specified variable values – Functions to set/query condition variable attributes are also included. • Naming conventions All identifiers in the threads library begin with pthread_
  • 32. The Pthreads API • The concept of opaque objects pervades the design of the API • The basic calls work to create or modify opaque objects • The opaque objects can be modified by calls to attribute functions, which deal with opaque attributes • The Pthreads API contains over 60 subroutines • We focus on those which are most likely to be immediately useful to the beginning Pthreads programmer • For portability, the pthread.h header file should be included in each source file using the Pthreads library.
  • 33. The Pthreads API • To compile using GNU on Linux: gcc -pthread • Pthread routines pthread_create(thread,attr,start_routine,arg)
  • 34. The Pthreads API • Initially, your main() program comprises a single, default thread. All other threads must be explicitly created by the programmer pthread_create(thread,attr,start_routine,arg) • pthread_create creates a new thread and makes it executable • This routine can be called any number of times from anywhere within your code
  • 35. Pthread_create • pthread_create arguments: – thread: An opaque, unique identifier for the new thread returned by the subroutine – attr: An opaque attribute object that may be used to set thread attributes You can specify a thread attributes object, or NULL for the default values – Start_routine: the C routine that the thread will execute once it is created – arg: A single argument that may be passed to start_routine. It must be passed by reference as a pointer cast of type void. NULL may be used if no argument is to be passed.
  • 36. Pthreads • Once created, threads are peers, and may create other threads • There is no implied hierarchy or dependency between threads
  • 37. Pthread Execution • Question: After a thread has been created, how do you know when it will be scheduled to run by the operating system? • Answer: Unless you are using the Pthreads scheduling mechanism, it is up to the implementation and/or operating system to decide where and when threads will execute. Robust programs should not depend upon threads executing in a specific order.
  • 38. Thread Attributes • By default, a thread is created with certain attributes • Some of these attributes can be changed by the programmer via the thread attribute object • pthread_attr_init and pthread_attr_destroy are used to initialize/destroy the thread attribute object • Other routines are then used to query/set specific attributes in the thread attribute object • Some of these attributes will be discussed later
  • 39. Terminating Threads • pthread_exit is used to explicitly exit a thread • Typically, the pthread_exit() routine is called after a thread has completed its work and is no longer required to exist • If main() finishes before the threads it has created, and exits with pthread_exit(), the other threads will continue to execute • Otherwise, they will be automatically terminated when main() finishes • The programmer may optionally specify a termination status, which is stored as a void pointer for any thread that may join the calling thread • Cleanup: the pthread_exit() routine does not close files • Any files opened inside the thread will remain open after the thread is terminated
  • 40. Discussion • In subroutines that execute to completion normally, you can often dispense with calling pthread_exit() • Unless, of course, you want to pass a return code back • However, in main(), there is a definite problem if main() completes before the threads it spawned • If you don't call pthread_exit() explicitly, when main() completes, the process (and all threads) will be terminated • By calling pthread_exit()in main(), the process and all of its threads will be kept alive even though all of the code in main() has been executed
  • 41. Example #include <pthread.h> #include <stdio.h> #include <stdlib.h> #define NUM_THREADS 5 void *PrintHello(void *threadid) { long tid; tid = (long)threadid; printf("Hello World! It's me, thread #%ld!n", tid); pthread_exit(NULL); }
  • 42. Example int main(int argc, char *argv[]) { pthread_t threads[NUM_THREADS]; int rc; long t; for(t=0;t<NUM_THREADS;t++) { printf("In main: creating thread %ldn", t); rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t ); if (rc) { printf("ERROR; return code from pthread_create() is %dn", rc); exit(-1); } } pthread_exit(NULL); }
  • 43. Example Output: In main: creating thread 0 In main: creating thread 1 In main: creating thread 2 In main: creating thread 3 In main: creating thread 4 Hello World! It's me, thread #0! Hello World! It's me, thread #1! Hello World! It's me, thread #2! Hello World! It's me, thread #3! Hello World! It's me, thread #4!
  • 44. Passing Arguments to Threads • The pthread_create() routine permits the programmer to pass one argument to the thread start routine • For cases where multiple arguments must be passed: – create a structure which contains all of the arguments – then pass a pointer to that structure in the pthread_create() routine. – All arguments must be passed by reference and cast to (void *) • Question: How can you safely pass data to newly created threads, given their non-deterministic start-up and scheduling? • ANSWER: Make sure that all passed data is thread safe - that it can not be changed by other threads • The three examples that follow demonstrate what not and what to do.
  • 45. Argument Passing Example 1 #include <pthread.h> #include <stdio.h> #include <stdlib.h> #define NUM_THREADS 8 char *messages[NUM_THREADS]; void *PrintHello(void *threadid) { int *id_ptr, taskid; sleep(1); id_ptr = (int *) threadid; taskid = *id_ptr; printf("Thread %d: %sn", taskid, messages[taskid]); pthread_exit(NULL); } This code fragment demonstrates how to pass a simple integer to each thread. The calling thread uses a unique data structure for each thread, insuring that each thread's argument remains intact throughout the program.
  • 46. Argument Passing Example 1 int main(int argc, char *argv[]) { pthread_t threads[NUM_THREADS]; int *taskids[NUM_THREADS]; int rc, t; messages[0] = "English: Hello World!"; messages[1] = "French: Bonjour, le monde!"; messages[2] = "Spanish: Hola al mundo"; messages[3] = "Klingon: Nuq neH!"; messages[4] = "German: Guten Tag, Welt!"; messages[5] = "Russian: Zdravstvytye, mir!"; messages[6] = "Japan: Sekai e konnichiwa!"; messages[7] = "Latin: Orbis, te saluto!";
  • 47. Argument Passing Example 1 // main, continued for(t=0;t<NUM_THREADS;t++) { taskids[t] = (int *) malloc(sizeof(int)); *taskids[t] = t; printf("Creating thread %dn", t); rc = pthread_create(&threads[t], NULL, PrintHello, (void *) taskids[t] ); if (rc) { printf("ERROR; return code from pthread_create() is %dn", rc); exit(-1); } } pthread_exit(NULL); }
  • 48. Argument Passing Example 1 Output Creating thread 0 Creating thread 1 Creating thread 2 Creating thread 3 Creating thread 4 Creating thread 5 Creating thread 6 Creating thread 7 Thread 0: English: Hello World! Thread 1: French: Bonjour, le monde! Thread 2: Spanish: Hola al mundo Thread 3: Klingon: Nuq neH! Thread 4: German: Guten Tag, Welt! Thread 5: Russian: Zdravstvytye, mir! Thread 6: Japan: Sekai e konnichiwa! Thread 7: Latin: Orbis, te saluto!
  • 49. Argument Passing Example 2 /****************************************************************************** * DESCRIPTION: * A "hello world" Pthreads program which demonstrates another safe way * to pass arguments to threads during thread creation. In this case, * a structure is used to pass multiple arguments. ******************************************************************************/ #include <pthread.h> #include <stdio.h> #include <stdlib.h> #define NUM_THREADS 8 char *messages[NUM_THREADS]; struct thread_data { int thread_id; int sum; char *message; }; struct thread_data thread_data_array[NUM_THREADS];
  • 50. Argument Passing Example 2 void *PrintHello(void *threadarg) { int taskid, sum; char *hello_msg; struct thread_data *my_data; sleep(1); my_data = (struct thread_data *) threadarg; taskid = my_data->thread_id; sum = my_data->sum; hello_msg = my_data->message; printf("Thread %d: %s Sum=%dn", taskid, hello_msg, sum); pthread_exit(NULL); }
  • 51. Argument Passing Example 2 int main(int argc, char *argv[]) { pthread_t threads[NUM_THREADS]; int *taskids[NUM_THREADS]; int rc, t, sum; sum=0; messages[0] = "English: Hello World!"; messages[1] = "French: Bonjour, le monde!"; messages[2] = "Spanish: Hola al mundo"; messages[3] = "Klingon: Nuq neH!"; messages[4] = "German: Guten Tag, Welt!"; messages[5] = "Russian: Zdravstvytye, mir!"; messages[6] = "Japan: Sekai e konnichiwa!"; messages[7] = "Latin: Orbis, te saluto!";
  • 52. Argument Passing Example 2 // main, continued for(t=0;t<NUM_THREADS;t++) { sum = sum + t; thread_data_array[t].thread_id = t; thread_data_array[t].sum = sum; thread_data_array[t].message = messages[t]; printf("Creating thread %dn", t); rc = pthread_create(&threads[t], NULL, PrintHello, (void *) &thread_data_array[t] ); if (rc) { printf("ERROR; return code from pthread_create() is %dn", rc); exit(-1); } } pthread_exit(NULL); }
  • 53. Argument Passing Example 2 Output Creating thread 0 Creating thread 1 Creating thread 2 Creating thread 3 Creating thread 4 Creating thread 5 Creating thread 6 Creating thread 7 Thread 0: English: Hello World! Sum=0 Thread 1: French: Bonjour, le monde! Sum=1 Thread 2: Spanish: Hola al mundo Sum=3 Thread 3: Klingon: Nuq neH! Sum=6 Thread 4: German: Guten Tag, Welt! Sum=10 Thread 5: Russian: Zdravstvytye, mir! Sum=15 Thread 6: Japan: Sekai e konnichiwa! Sum=21 Thread 7: Latin: Orbis, te saluto! Sum=28
  • 54. Example 3 - Thread Argument Passing (Incorrect) /***************************************************************************** * DESCRIPTION: * This "hello world" Pthreads program demonstrates an unsafe (incorrect) * way to pass thread arguments at thread creation. In this case, the * argument variable is changed by the main thread as it creates new threads. ******************************************************************************/ #include <pthread.h> #include <stdio.h> #include <stdlib.h> #define NUM_THREADS 8 void *PrintHello(void *threadid) { long taskid; sleep(1); taskid = (long) threadid; printf("Hello from thread %ldn", taskid); pthread_exit(NULL); }
  • 55. Example 3 - Thread Argument Passing (Incorrect) int main(int argc, char *argv[]) { pthread_t threads[NUM_THREADS]; int rc; long t; for(t=0;t<NUM_THREADS;t++) { printf("Creating thread %ldn", t); rc = pthread_create(&threads[t], NULL, PrintHello, (void *) &t); if (rc) { printf("ERROR; return code from pthread_create() is %dn", rc); exit(-1); } } pthread_exit(NULL); }
  • 56. Argument Passing Example 3 Output Creating thread 0 Creating thread 1 Creating thread 2 Creating thread 3 Creating thread 4 Creating thread 5 Creating thread 6 Creating thread 7 Hello from thread 140737488348392 Hello from thread 140737488348392 Hello from thread 140737488348392 Hello from thread 140737488348392 Hello from thread 140737488348392 Hello from thread 140737488348392 Hello from thread 140737488348392 Hello from thread 140737488348392
  • 57. Compilation • The pthread.h header file must be the first included file of each source file using the threads library. • Otherwise, the -D_THREAD_SAFE compilation flag should be used
  • 58. Joining and Detaching Threads • Routines: • pthread_join(threadid,status) • pthread_detach(threadid,status) • pthread_attr_setdetachstate(attr,detachstate) • pthread_attr_getdetachstate(attr,detachstate) • The possible attribute states for the last two routines are: – PTHREAD_CREATE_DETACHED or – PTHREAD_CREATE_JOINABLE.
  • 59. Joining • "Joining" is one way to accomplish synchronization between threads. • For example:
  • 60. Joining • The pthread_join() subroutine blocks the calling thread until the specified threadid thread terminates • The programmer is able to obtain the target thread's termination return status if it was specified in the target thread's call to pthread_exit() • It is a logical error to attempt simultaneous multiple joins on the same target thread
  • 61. Joinable or Not? • When a thread is created, one of its attributes defines whether it is joinable or detached • Only threads that are created as joinable can be joined • If a thread is created as detached, it can never be joined • The final draft of the POSIX standard specifies that threads should be created as joinable • However, not all implementations may follow this.
  • 62. Joinable or Not? • To explicitly create a thread as joinable or detached, the attr argument in the pthread_create() routine is used • The typical 4 step process is: 1. Declare a pthread attribute variable of the pthread_attr_t data type 2. Initialize the attribute variable with pthread_attr_init() 3. Set the attribute detached status with pthread_attr_setdetachstate() 4. When done, free library resources used by the attribute with pthread_attr_destroy()
  • 63. Detach • The pthread_detach()routine can be used to explicitly detach a thread even though it was created as joinable • There is no converse routine • Recommendations: • If a thread requires joining, consider explicitly creating it as joinable • This provides portability as not all implementations may create threads as joinable by default • If you know in advance that a thread will never need to join with another thread, consider creating it in a detached state • Some system resources may be able to be freed.
  • 64. Example: Pthread Joining • Example Code - Pthread Joining • This example demonstrates how to "wait" for thread completions by using the Pthread join routine. • Since some implementations of Pthreads may not create threads in a joinable state, the threads in this example are explicitly created in a joinable state
  • 65. Example: Pthread Joining #include <pthread.h> #include <stdio.h> #include <stdlib.h> #define NUM_THREADS 4 void *BusyWork(void *t) { int i; long tid; double result=0.0; tid = (long) t; printf("Thread %ld starting...n",tid); for (i=0; i<1000000; i++) { result = result + sin(i) * tan(i); } printf("Thread %ld done. Result = %en",tid, result); pthread_exit((void*) t); }
  • 66. Example: Pthread Joining int main (int argc, char *argv[]) { pthread_t thread[NUM_THREADS]; pthread_attr_t attr; int rc; long t; void *status; /* Initialize and set thread detached attribute */ pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); for(t=0; t<NUM_THREADS; t++) { printf("Main: creating thread %ldn", t); rc = pthread_create(&thread[t], &attr, BusyWork, (void *)t); if (rc) { printf("ERROR; return code from pthread_create() is %dn", rc); exit(-1); } }
  • 67. Example: Pthread Joining /* Free attribute and wait for the other threads */ pthread_attr_destroy(&attr); for(t=0; t<NUM_THREADS; t++) { rc = pthread_join(thread[t], &status); if (rc) { printf("ERROR; return code from pthread_join() is %dn", rc); exit(-1); } printf("Main: completed join with thread %ld “ ”having a status of %ldn",t,(long)status); } printf("Main: program completed. Exiting.n"); pthread_exit(NULL); }
  • 68. Example: Pthread Joining Main: creating thread 0 Main: creating thread 1 Thread 0 starting... Main: creating thread 2 Thread 1 starting... Main: creating thread 3 Thread 2 starting... Thread 3 starting... Thread 1 done. Result = -3.153838e+06 Thread 0 done. Result = -3.153838e+06 Main: completed join with thread 0 having a status of 0 Main: completed join with thread 1 having a status of 1 Thread 3 done. Result = -3.153838e+06 Thread 2 done. Result = -3.153838e+06 Main: completed join with thread 2 having a status of 2 Main: completed join with thread 3 having a status of 3 Main: program completed. Exiting.
  • 69. Miscellaneous Routines • pthread_self() returns the unique, system assigned thread ID of the calling thread • pthread_equal(thread1,thread2) compares two thread IDs. If the two IDs are different 0 is returned, otherwise a non-zero value is returned • Note that for both of these routines, the thread identifier objects are opaque and can not be easily inspected • Because thread IDs are opaque objects, the C language equivalence operator == should not be used – to compare two thread IDs against each other, or – to compare a single thread ID against another value.
  • 70. Miscellaneous Routines • pthread_once(once_control, init_routine) • pthread_once executes the init_routine exactly once in a process. • The first call to this routine by any thread in the process executes the given init_routine, without parameters. • Any subsequent call will have no effect. • The init_routine routine is typically an initialization routine. • The once_control parameter is a synchronization control structure that requires initialization prior to calling pthread_once • For example: pthread_once_t once_control=PTHREAD_ONCE_INIT;
  • 71. pthread_yield Subroutine • Purpose: Forces the calling thread to relinquish use of its processor • NOTE: this routine is NOT available on Linux machines and some Solaris machines. Use sched_yield, from unistd.h, instead. • Library: Threads Library (libpthreads.a) • Syntax: #include <pthread.h> void pthread_yield () • Description: The pthread_yield subroutine forces the calling thread to relinquish use of its processor, and to wait in the run queue before it is scheduled again If the run queue is empty when the pthread_yield subroutine is called, the calling thread is immediately rescheduled.
  • 72. Homework • Review Questions 4.1 to 4.15 on page 200 • Problem 4.10 on page 202 • Problem 5.3 on page 253 • Problem 5.6 on page 254