Pthreads (2) Dong-kun Shin Embedded Software Laboratory Sungkyunkwan University Embedded Software Lab.

Similar documents
Pthreads. Jin-Soo Kim Computer Systems Laboratory Sungkyunkwan University

ANSI/IEEE POSIX Standard Thread management

Concurrent Programming

Synchronization: Advanced

Programming with Threads Dec 7, 2009"

Shared Variables in Threaded C Programs. Systemprogrammering Föreläsning 11 Programming with Threads

for (i = 0; i < 2; i++)

! What is the memory model for threads? ! How are variables mapped to memory instances? ! How many threads reference each of these instances?

Concurrency on x86-64; Threads Programming Tips

Proxy: Concurrency & Caches

Synchronization April 29, 2008

Multithreading Programming II

Example. Example. Threading Language and Support. CS528 Multithreading: Programming with Threads. The boss/worker model. Thread Programming models

More Shared Memory Programming

Carnegie Mellon Synchronization: Advanced

Threads. Jinkyu Jeong Computer Systems Laboratory Sungkyunkwan University

Condition Variables. Jinkyu Jeong Computer Systems Laboratory Sungkyunkwan University

Threads need to synchronize their activities to effectively interact. This includes:

Synchronization and Semaphores. Copyright : University of Illinois CS 241 Staff 1

Introduc)on to pthreads. Shared memory Parallel Programming

Posix Threads (Pthreads)

Synchronization Primitives

COSC 6374 Parallel Computation. Shared memory programming with POSIX Threads. Edgar Gabriel. Fall References

Programming with Threads

Threads. Jo, Heeseung

POSIX Threads. HUJI Spring 2011

Synchronization and Semaphores. Copyright : University of Illinois CS 241 Staff 1

CSci 4061 Introduction to Operating Systems. Synchronization Basics: Locks

Thread Posix: Condition Variables Algoritmi, Strutture Dati e Calcolo Parallelo. Daniele Loiacono

Threads. Jo, Heeseung

THREADS. Jo, Heeseung

CS-345 Operating Systems. Tutorial 2: Grocer-Client Threads, Shared Memory, Synchronization

Agenda. Process vs Thread. ! POSIX Threads Programming. Picture source:

Process Synchronization

Lecture 19: Shared Memory & Synchronization

Paralleland Distributed Programming. Concurrency

Computer Systems Laboratory Sungkyunkwan University

Introduction to parallel computing

TCSS 422: OPERATING SYSTEMS

Lecture 4. Threads vs. Processes. fork() Threads. Pthreads. Threads in C. Thread Programming January 21, 2005

HPCSE - I. «Introduction to multithreading» Panos Hadjidoukas

Operating System Labs. Yuanbin Wu

Oct 2 and 4, 2006 Lecture 8: Threads, Contd

This exam paper contains 8 questions (12 pages) Total 100 points. Please put your official name and NOT your assumed name. First Name: Last Name:

CSCI4430 Data Communication and Computer Networks. Pthread Programming. ZHANG, Mi Jan. 26, 2017

Parallel Computing: Programming Shared Address Space Platforms (Pthread) Jin, Hai

Data Races and Deadlocks! (or The Dangers of Threading) CS449 Fall 2017

POSIX Threads. Paolo Burgio

Ricardo Rocha. Department of Computer Science Faculty of Sciences University of Porto

CS 105, Spring 2007 Ring Buffer

Solving the Producer Consumer Problem with PThreads

Threads. lightweight processes

POSIX PTHREADS PROGRAMMING

Warm-up question (CS 261 review) What is the primary difference between processes and threads from a developer s perspective?

real time operating systems course

LSN 13 Linux Concurrency Mechanisms

CS 105, Spring 2015 Ring Buffer

Programming Languages

Chapter 4 Threads. Images from Silberschatz 03/12/18. CS460 Pacific University 1

Chapter 4 Concurrent Programming

POSIX threads CS 241. February 17, Copyright University of Illinois CS 241 Staff

Lecture #24 Synchronization

Motivation and definitions Processes Threads Synchronization constructs Speedup issues

CS444 1/28/05. Lab 03

1. Introduction. 2. Project Submission and Deliverables

Synchroniza+on: Advanced

Interlude: Thread API

Pthreads: POSIX Threads

TCSS 422: OPERATING SYSTEMS

Multithread Programming. Alexandre David

Synchronising Threads

pthreads CS449 Fall 2017

Operating systems and concurrency (B08)

Pre-lab #2 tutorial. ECE 254 Operating Systems and Systems Programming. May 24, 2012

CS 220: Introduction to Parallel Computing. Condition Variables. Lecture 24

Unix. Threads & Concurrency. Erick Fredj Computer Science The Jerusalem College of Technology

CS61C : Machine Structures

Synchronization Mechanisms

C Grundlagen - Threads

Synchronization. Dr. Yingwu Zhu

Assignment #2. Problem 2.1: airplane synchronization

Multi-threaded Programming

Programming Shared Address Space Platforms (cont.) Alexandre David B2-206

CSCE 313: Introduction to Computer Systems

CS240: Programming in C. Lecture 18: PThreads

Review: Multicore everywhere!

CSC 1600: Chapter 6. Synchronizing Threads. Semaphores " Review: Multi-Threaded Processes"

Operating Systems (2INC0) 2017/18

Synchronization. Semaphores implementation

PThreads in a Nutshell

COMP 3430 Robert Guderian

CS 470 Spring Mike Lam, Professor. Semaphores and Conditions

Chapter 5: Achieving Good Performance

CS 333 Introduction to Operating Systems. Class 3 Threads & Concurrency. Jonathan Walpole Computer Science Portland State University

CS 153 Lab6. Kishore Kumar Pusukuri

CSCI 4061: Threads in a Nutshell

Thread and Synchronization

Concurrent Programming

Shared Memory Programming with Pthreads. T. Yang. UCSB CS240A.

Total Score is updated. The score of PA4 will be changed! Please check it. Will be changed

Transcription:

1 Pthreads (2) Dong-kun Shin Embedded Software Laboratory Sungkyunkwan University http://nyx.skku.ac.kr

Last Class Review 2 ANSI/IEEE POSIX1003.1-95 Standard Thread management Work directly on threads creating, terminating, joining, etc. Include functions to set/query thread attributes. Mutexes Provide for creating, destroying, locking and unlocking mutexes. Condition variables (Today) Include functions to create, destroy, wait and signal based upon specified variable values.

Condition Variables (1) 3 Another way for thread synchronization While mutexes implement synchronization by controlling thread access to data, condition variables allow threads to synchronize based upon the actual value of data. Without condition variables, the programmer would need to have threads continually polling to check if the condition is met. This can be very resource consuming since the thread would be continuously busy in this activity. A condition variable is always used in conjunction with a mutex lock.

Condition Variables (2) 4 How condition variables work A thread locks a mutex associated with a condition variable. The thread tests the condition to see if it can proceed. If it can Your thread does its work Your thread unlocks the mutex If it cannot The thread sleeps. The mutex is automatically released. Some other threads signals the condition variable. Your thread wakes up from waiting with the mutex automatically locked, and it does its work. Your thread releases the mutex when it s done.

Creating/Destroying CV 5 Static initialization pthread_cond_t cond = PTHREAD_COND_INITIALIZER; Dynamic initialization pthread_cond_t cond; pthread_cond_init (&cond, (pthread_condattr_t *)NULL); Destroying a condition variable pthread_cond_destroy (&cond); Destroys a condition variable, freeing the resources it might hold.

Using Condition Variables 6 int pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex) Blocks the calling thread until the specified condition is signalled. This should be called while mutex is locked, and it will automatically release the mutex while it waits. int pthread_cond_signal (pthread_cond_t *cond) Signals another thread which is waiting on the condition variable. Calling thread should have a lock. int pthread_cond_broadcast(pthread_cond_t *cond) Used if more than one thread is in a blocking wait state.

Producer-Consumer (1) 7 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #define QSIZE 5 #define LOOP 30 typedef struct { int data[qsize]; int index; int count; pthread_mutex_t lock; pthread_cond_t notfull; pthread_cond_t notempty; queue_t; void *produce (void *args); void *consume (void *args); void put_data (queue_t *q, int d); int get_data (queue_t *q);

Producer-Consumer (2) 8 int main () { queue_t *q; pthread_t producer, consumer; q = qinit(); pthread_create(&producer, NULL, produce, (void *)q); pthread_create(&consumer, NULL, consume, (void *)q); pthread_join (producer, NULL); pthread_join (consumer, NULL); qdelete();

Producer-Consumer (3) 9 queue_t *qinit() { queue_t *q; q = (queue_t *) malloc(sizeof(queue_t)); q->index = q->count = 0; pthread_mutex_init(&q->lock, NULL); pthread_cond_init(&q->notfull, NULL); pthread_cond_init(&q->notempty, NULL); return q; void qdelete(queue_t *q) { pthread_mutex_destroy(&q->lock); pthread_cond_destroy(&q->notfull); pthread_cond_destroy(&q->notempty); free(q);

Producer-Consumer (4) 10 void *produce(void *args) { int i, d; queue_t *q = (queue_t *)args; for (i = 0; i < LOOP; i++) { d = random() % 10; put_data(q, d); printf( put data %d to queue\n, d); pthread_exit(null); void *consume(void *args) { int i, d; queue_t *q = (queue_t *)args; for (i = 0; i < LOOP; i++) { d = get_data(q); printf( got data %d from queue\n, d); pthread_exit(null);

Producer-Consumer (5) 11 void put_data(queue_t *q, int d) { pthread_mutex_lock(&q->lock); while (q->count == QSIZE) pthread_cond_wait(&q->notfull, &q->lock); q->data[(q->index + q->count) % QSIZE] = d; q->count++; pthread_cond_signal(&q->notempty); pthread_mutex_unlock(&q->lock); int get_data(queue_t *q) { int d; pthread_mutex_lock(&q->lock); while (q->count == 0) pthread_cond_wait(&q->notempty, &q->lock); d = q->data[q->index]; q->index = (q->index + 1) % QSIZE; q->count--; pthread_cond_signal(&q->notfull); pthread_mutex_unlock(&q->lock); return d;

Thread Safety (1) 12 Thread-safe Functions called from a thread must be thread-safe. We identify four (non-disjoint) classes of thread-unsafe functions: Class 1: Failing to protect shared variables Class 2: Relying on persistent state across invocations Class 3: Returning a pointer to a static variable Class 4: Calling thread-unsafe functions

Thread Safety (2) 13 Class 1: Failing to protect shared variables. Fix: Use mutex operations. Issue: Synchronization operations will slow down code. pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; int cnt = 0; /* Thread routine */ void *count(void *arg) { int i; for (i=0; i<niters; i++) { pthread_mutex_lock (&lock); cnt++; pthread_mutex_unlock (&lock); return NULL;

Thread Safety (3) 14 Class 2: Relying on persistent state across multiple function invocations. Random number generator relies on static state Fix: Rewrite function so that caller passes in all necessary state. /* rand - return pseudo-random integer on 0..32767 */ int rand(void) { static unsigned int next = 1; next = next*1103515245 + 12345; return (unsigned int)(next/65536) % 32768; /* srand - set seed for rand() */ void srand(unsigned int seed) { next = seed;

Thread Safety (4) 15 Class 3: Returning a ptr to a static variable. Fixes: 1. Rewrite code so caller passes pointer to struct. Issue: Requires changes in caller and callee. 2. Lock-and-copy Issue: Requires only simple changes in caller (and none in callee) However, caller must free memory. struct hostent *gethostbyname(char *name){ static struct hostent h; <contact DNS and fill in h> return &h; hostp = malloc(...)); gethostbyname_r(name, hostp); struct hostent *gethostbyname_ts(char *name) { struct hostent *unshared = malloc(...); pthread_mutex_lock(&lock); /* lock */ shared = gethostbyname(name); *unshared = *shared; /* copy */ pthread_mutex_unlock(&lock); return q;

Thread Safety (5) 16 Class 4: Calling thread-unsafe functions. Calling one thread-unsafe function makes an entire function thread-unsafe. Fix: Modify the function so it calls only thread-safe functions

Reentrant Functions 17 A function is reentrant iff it accesses NO shared variables when called from multiple threads. Reentrant functions are a proper subset of the set of thread-safe functions. All functions Thread-safe functions Reentrant functions Thread-unsafe functions NOTE: The fixes to Class 2 and 3 thread-unsafe functions require modifying the function to make it reentrant.

Thread-Safe Library 18 All functions in the Standard C Library (at the back of your K&R text) are thread-safe. Examples: malloc, free, printf, scanf Most Unix system calls are thread-safe, with a few exceptions: Thread-unsafe function Class Reentrant version asctime 3 asctime_r ctime 3 ctime_r gethostbyaddr 3 gethostbyaddr_r gethostbyname 3 gethostbyname_r inet_ntoa 3 (none) localtime 3 localtime_r rand 2 rand_r

Exercise 아래의내용을 conditional variable 을사용하여구현후, 자신의프로그램이잘작동함을증명 가정 deposit(): 수당을받음 withdraw(): 카드값이빠져나감 조건 하나의카드값은나눠서빠져나가지않는다. 카드값이빠져나간후의잔고는 0원보다작을수없다. 카드값은잔고가충분해지면즉시출금된다.