400 likes | 525 Vues
This tutorial provides an overview of Pthreads (POSIX threads) and their implementation for concurrent programming in C. It covers the history, advantages, and API of Pthreads, including thread management, synchronization mechanisms like mutexes and condition variables, and examples such as the classic "Hello World" program using threads. You'll learn how to create, manage, and terminate threads, as well as how to handle inter-thread communication effectively. Ideal for developers looking to enhance their C programming skills with concurrency.
E N D
Pthreads & Concurrency implementation
Acknowledgements • The material in this tutorial is based in part on: • POSIX Threads Programming , by Blaise Barney
History Advantages Content Pthreads Overview
History • Different versions of threads • each hardware vendor created own version • IEEE POSIX 1003.1c Standard • C programming types and procedure calls
Advantages • Potential program performance gains
Advantages • More efficient inter-thread communication • Threaded applications • Overlap CPU work and I/O • Priority/Real-time scheduling • Asynchronous event handling
The Pthreads API • Thread management • Create, detach, join • Set/query thread attributes • Mutex • Mutual Exclusion • Condition variables • Address communications between threads • Non-mutex synchronization • Read/write locks • Barriers
The Pthreads API • Naming conventions
Create & Terminate • Program: Hello World Threads Management
Creation • Routine • pthread_create( thread, attr, start_routine, arg)
Termination • Four ways for a Pthread to terminate • Returns from start_routine • Call pthread_exit routine • Cancel by another thread through pthread_cancel routine • exit call
Example: Hello World • Program Requirements • Print “Hello World” through standard output • Use two threads to finish the task, one should print “Hello”, the other should print “World” • Terminate all related threads after finishing the printing task
Example: Hello World #include <stdio.h> #include <pthread.h> ……
Example: Hello World void print_message_function( void *ptr ) { char *message; message = (char *) ptr; printf("%s ", message); }
Example: Hello World main() { pthread_t thread1, thread2; char *message1 = "Hello"; char *message2 = "World"; …… }
Example: Hello World main() { pthread_t thread1, thread2; char *message1 = "Hello"; char *message2 = "World"; …… }
Example: Hello World main() { pthread_t thread1, thread2; char *message1 = "Hello"; char *message2 = "World"; …… }
Example: Hello World main() { …… pthread_create(&thread1, pthread_attr_default, (void*)&print_message_function, (void*) message1); pthread_create(&thread2, pthread_attr_default, (void*)&print_message_function, (void*) message2); exit(0); }
Example: Hello World main() { …… pthread_create(&thread1, pthread_attr_default, (void*)&print_message_function, (void*) message1); pthread_create(&thread2, pthread_attr_default, (void*)&print_message_function, (void*) message2); exit(0); }
Example: Hello World main() { …… pthread_create(&thread1, pthread_attr_default, (void*)&print_message_function, (void*) message1); pthread_create(&thread2, pthread_attr_default, (void*)&print_message_function, (void*) message2); exit(0); }
Example: Hello World main() { …… pthread_create(&thread1, pthread_attr_default, (void*)&print_message_function, (void*) message1); pthread_create(&thread2, pthread_attr_default, (void*)&print_message_function, (void*) message2); exit(0); }
Example: Hello World main() { …… pthread_create(&thread1, pthread_attr_default, (void*)&print_message_function, (void*) message1); pthread_create(&thread2, pthread_attr_default, (void*)&print_message_function, (void*) message2); exit(0); }
Example: Hello World main() { …… pthread_create(&thread1, pthread_attr_default, (void*)&print_message_function, (void*) message1); pthread_create(&thread2, pthread_attr_default, (void*)&print_message_function, (void*) message2); exit(0); }
Example: Hello World main() { …… pthread_create(&thread1, pthread_attr_default, (void*)&print_message_function, (void*) message1); pthread_create(&thread2, pthread_attr_default, (void*)&print_message_function, (void*) message2); exit(0); }
Example: Hello World Thread 1 default thread Thread 2
Example: Hello World Thread 1 default thread Thread 2
Example: Hello World Thread 1 default thread Thread 2
Example: Hello World Thread 1 default thread Thread 2
Example: Hello World Thread 1 default thread Thread 2
Example: Hello World Thread 1 default thread Thread 2 Printf Printf
Example: Hello World Thread 1 default thread Thread 2 Printf Exit Printf
Example: Hello World Thread 1 standard output Thread 2 Thread 1 default thread Thread 2 Return
Example: Hello World void print_message_function( void *ptr ) { char *message; message = (char *) ptr; printf("%s ", message); } main() { …… pthread_exit(); //exit(0); }
Example: Hello World void print_message_function( void *ptr ) { char *message; message = (char *) ptr; printf("%s ", message); pthread_exit(); } main() { …… pthread_exit(); //exit(0); }
Passing parameters 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, this limitation is overcome by creating a structure which contains all of the arguments, and then passing a pointer to that structure. • All arguments must be passed by reference and cast to (void *).
Joining and detaching threads • pthread_join(threadid,status) • blocks the calling thread until the specified threadid thread terminates. • target thread's termination return status placed in status if specified in the target thread's call to pthread_exit(). • A joining thread can match one pthread_join() call. • It is a logical error to attempt multiple joins on the same thread. • pthread_detach(threadid, status) • to explicitly detach a thread • pthread_attr_setdetachstate(attr,detachstate) • pthread_attr_getdetachstate(attr, detachstate)
Create & Destroy • Lock & Unlock • Program: Bounded Buffer Mutex
Mutex • Mutual Exclusion • Act as a “lock” to prevent race conditions • Typical sequence of use • create, initialize • lock, unlock • destroy • Losers in the competition for the mutex variable have to block
Creating & Destroying • Type: pthread_mutex_t • Initializing • Statically • pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER • Dynamically • pthread_mutex_init (mutex, attr) • pthread_mutex_attr_tattr specifies protocol for priorities, priority ceiling, and process sharing • Destroying • pthread_mutex_destroy – to delete a mutex object • pthread_mutex_attr_destroy – to delete a mutexattr object
Lock & Unlock • Lock • pthread_mutex_lock (mutex) • blocks calling thread if mutex already locked • pthread_mutex_trylock(mutex) • returns with “busy” code if already locked • Unlock • pthread_mutex_unlock (mutex) • Error • mutex is released • mutex owned by others