Thread Programming
Topics
• Thread
– Thread NPTL thread library commands
– Thread Safety
– Thread libraries
– Threading issues
– Linux Threads
4 Reasons for threads
•
Express logically concurrent tasks
•
Run work in the background
•
Exploit multiple processors
•
Manage I/O devices
Process (fork) vs Thread creation
Process
• Fork() is relatively
expensive to launch
• Difficult to share
information between
processes
• Faster creation (10x or
better..
• Sharing information is
easy.. Just copy
information into a
shared heap.
-> That requires
synchronization between
threads
Thread Advantages
• Sharing data between threads is easier
• Thread Creation is faster
• Used extensively in Operating Systems
Thread Usage (1)
Figure 2-7. A word processor with three threads.
Tanenbaum & Bo,Modern Operating Systems:4th ed., (c) 2013 Prentice-Hall, Inc. All rights reserved.
Thread Usage (2)
Figure 2-8. A multithreaded Web server.
Tanenbaum & Bo,Modern Operating Systems:4th ed., (c) 2013 Prentice-Hall, Inc. All rights reserved.
Thread Usage (3)
Figure 2-9. A rough outline of the code for Fig. 2-8.
(a) Dispatcher thread. (b) Worker thread.
Tanenbaum & Bo,Modern Operating Systems:4th ed., (c) 2013 Prentice-Hall, Inc. All rights reserved.
Thread Disadvantages
First let’s look at threads in memory space
Stack and Stack Frames
square (int x)
{ return x*x }
STACK
Frames for C run-time start up
functions
doCalc(int val)
{
printf (“square is %d\n”,
square(val) }
main (int x, int y)
{ key = 9999
doCalc (key) }
Frame for doCalc
Frame for square
Stack for main
4 Threads executing
in process in linux
argv, environ
Stack for main thread
Stack for thread 3
Stack for thread 2
Stack for thread 1
Code is re-entrant
Shared libraries, shared memory
Heap
Uninitialized Data (BSS)
Initialized Data
Thread 3 executing here
Main thread executing here
Thread 1 executing here
Thread 2 executing here
Text (program code)
Threads share
•
•
•
•
•
•
Process ID and parent process ID
Controlling terminal
Credentials
Open files and locks
Resource limits
CPU times consumed.
Attributes distinct for Threads
•
•
•
•
•
•
Thread ID
Thread-specific data
Real-time scheduling policy
CPU affinity
Stack (local variables and function call linkage)
Processor registers in switc
Thread resource
Shared State
Per-Thread State
Heap
Thread
Control Block
Stack
Information
Global
Variables
Code
Saved
Registers
Thread
Metadata
Thread Stack
Per-Thread State
Thread
Control Block
Stack
Information
Saved
Registers
Thread
Metadata
Thread Stack
The Classical Thread Model
Figure 2-12. The first column lists some items shared by all
threads in a process. The second one lists some items
private to each thread.
Tanenbaum & Bo,Modern Operating Systems:4th ed., (c) 2013 Prentice-Hall, Inc. All rights reserved.
The Classical Thread Model (1)
Figure 2-11. (a) Three processes each with one thread.
(b) One process with three threads.
Tanenbaum & Bo,Modern Operating Systems:4th ed., (c) 2013 Prentice-Hall, Inc. All rights reserved.
The Classical Thread Model (3)
Figure 2-13. Each thread has its own stack.
Tanenbaum & Bo,Modern Operating Systems:4th ed., (c) 2013 Prentice-Hall, Inc. All rights reserved.
POSIX Threads (1)
Figure 2-14. Some of the Pthreads function calls.
Tanenbaum & Bo,Modern Operating Systems:4th ed., (c) 2013 Prentice-Hall, Inc. All rights reserved.
Implementing Threads
in User Space or Kernel Space
(a)
(b)
Figure 2-16. (a) A user-level threads package.
(b) A threads package managed by the kernel.
Tanenbaum & Bo,Modern Operating Systems:4th ed., (c) 2013 Prentice-Hall, Inc. All rights reserved.
Pop-Up Threads
Figure 2-18. Creation of a new thread when a message arrives.
(a) Before the message arrives. (b) After the message arrives.
Tanenbaum & Bo,Modern Operating Systems:4th ed., (c) 2013 Prentice-Hall, Inc. All rights reserved.
Thread Lifecycle
Thread Safety
• A function is said to be thread-safe if it can be
safely invoked by multiple threads at the same
time.
• Conversely, if a function is not thread-safe,
then we can’t call it from one thread while it is
being executed in another thread.
Two threads call yield
Thread Disadvantages
• Must ensure thread safety
• Bug in one thread can exhibit itself in ALL
threads
• Threads are competing for finite virtual
address space.
Compiling Thread Programs
On Linux compile with the -pthread option.
The effects include
• _REENTRANT preprocessor macro is defined.
• Links with libpthread lib
Creating Threads
#include <pthread.h>
int pthread_create( pthread_t *thread.
const pthread_attr_t *attr,
void *(*start_routine)(void *),
void *arg));
• Thread points to buffer for unique thread ID
• If attr is NULL, the default attributes are used.
• Upon its creation, the thread executes
start_routine, with arg as its sole argument.
Thread ID
#include <pthread.h>
pthread_t pthread_self(void));
• Each thread within a process is uniquely
identified by the Thread Id
• This is returned on pthread_create()
Thread Termination
#include <pthread.h>
void pthread_exit(void *retval));
• The thread’s start function returns with return
value
• Thread calls pthread_exit()
• Thread is cancelled by external program
• Main thread performs a return (causes all threads
to terminate immediately)
Thread Cancellation
#include <pthread.h>
void pthread_cancel(pthread_t thread));
• Threads can protect themselves from
cancellation by setting its flag.
• When cancellation is enabled, it is done only
when the thread reaches its next cancellation
point.
Joining with a Terminated Thread
#include <pthread.h>
int pthread_join(pthread_ t thread, void **retval);
• Returns 0 on success or a positive error
number on error
• Waits for the thread to terminate.
Detaching a Thread
#include <pthread.h>
int pthread_detach (pthread_ t thread);
• When we don’t care to wait for a thread to
finish.
Create Threads example
• https://computing.llnl.gov/tutorials/pthreads/
• http://www.tutorialspoint.com/cplusplus/cpp
_multithreading.htm
To see thread information
ps -m
ps m –o pid,tid,command