Top Banner
many to one one to one many to many Multithreading models
22

many to one

Jan 04, 2016

Download

Documents

Benjamin Noys

Multithreading models. many to many. many to one. one to one. Sun Solaris Thread Architecture. Thread Functions. Thread Functions. thr_create(void *stack_base, size_t stack_size, void*(*start_routine)(void*), void* arg, long flag, thead_t * new_thread); - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: many to one

many to one one to one many to many

Multithreading models

Page 2: many to one

Sun Solaris Thread Architecture

Page 3: many to one

Thread Functions

function description

thr_create Create a thread

thr_self Get the thread identifier

thr_yield Yield thread execution

thr_exit Terminate a thread

thr_join Wait for thread termination

thr_suspend Suspend thread execution

thr_continue Continue thread execution

thr_setprio Set the thread priority

thr_getprio Get the thread priority

Page 4: many to one

Thread Functions

thr_create(void *stack_base, size_t stack_size, void*(*start_routine)(void*), void* arg, long flag, thead_t * new_thread);

stack_base - contain the address for the stack, if it is NULL, thr_create will allocate a stack for the new thread with at least stack_size bytes.stack_size - contain the size, in number of bytes, for the stack that the new thread uses.start_routine - contain the function which the new thread begins execution.arg – Can be anything that is described by void, which is typically any 4-bytes value. Note that you can supply only one argument. To get your procedure

to take multiple arguments, encode them as one structure.

Page 5: many to one

Thread Functions

thr_create(void *stack_base, size_t stack_size, void*(*start_routine)(void*), void* arg, long flag, thead_t * new_thread);

flags – Specifies attributes for the created thread. In the most cases a zero value work best.THR_SUSPENDED

THR_DETACHED

THR_BOUND

THR_NEW_LWP

THR_DAEMON

new_thread – Points to a location where the ID of the new thread is stored

Page 6: many to one

Thread Functions

Get the thread identifier

thread_t thr_self(void);

Yield thread execution

void thr_yield(void);

void thr_exit(void* status);

Terminate a thread

Page 7: many to one

thr_join(thread_t tid, thread_t *departedid, void **status);

Wait for thread termination

Thread Functions

thread_t tid;thread_t departedid;int ret;int status;

ret = thr_join( tid, &departedid, (void*) status); //join tid thread with statusret = thr_join(tid, &departedid, NULL);//join tid thread without statusret = thr_join(tid, NULL, NULL);//join tid thread without return id and statusret = thr_join(NULL, &departedid, NULL);

Page 8: many to one

Thread Functions

int thr_suspend(thread_d tid);

Suspend thread execution

Continue thread execution

int thr_continue(thread_t tid);

Page 9: many to one

Set the thread priority

Thread Functions

Thread_t tid;int ret;int newprio = 20;

ret = thr_create(NULL, NULL, func, arg, THR_SUSPEND, &tid);// suspend created threadret = thr_setprio(tid, newprio);// set the new priority to the new threadret = thr_continue(tid);//suspended thread starts to execute with the new priority

int thr_setprio(thread_t tid, int newprio);Get the thread priority

int thr_getprio(thread_t tid, int * newprio);

Page 10: many to one

Critical Section

P1: X++;

Load M(0x300)INCStore M(0x300);

P1: load M(0x300)P1: INCP2: load M(0x300)P2: DECP1: Store M(0x300)P2: Store M(0x300)

P2: X--;

Load M(0x300)DECStore M(0x300);

Page 11: many to one

Synchronization Functions

Mutual Exclusion Lock . Initialize a mutex . Destroy a mutex . Acquire a mutex . Release a mutex . Try to acquire a mutex

Page 12: many to one

Synchronization Functions

Initialize a mutex

mutex_t mp;

int mutex_init(mutex_t *mp, int type, void *arg);

TYPE:1. USYNC_PROCESS : the mustex can be used to synchronize threads and other processes.2. USYNC_PROCESS_ROBUST : the mutex can be used to robustly synchronize threads in this and other processes.3. USYNC_THREAD : the mutex can be used to synchronize threads in this process only.

Page 13: many to one

. Destroy a mutex

int mutex_destroy(mutex_t* mp);

. Acquire a mutex

int mutex_lock(mutex_t* mp);

. Release a mutex

int mutex_unlock(mutex_t* mp);

. Try to acquire a mutex

int mutex_trylock(mutex_t* mp);

Synchronization Functions

Page 14: many to one

Synchronization Functions

Condition Variables

- Initialize a condition variable - Destroy a condition variable - Wait for a condition variable - Wait for an absolute time - Signal one condition variable - Signal all condition variable

Page 15: many to one

Synchronization Functions

Initialize a condition variables

cond_t cv;

int cond_init(cond_t *cv, int type, int arg);

TYPE:1. USYNC_PROCESS : the condition variables can be used to synchronize threads and other processes.

2. USYNC_THREAD : the condition variables can be used to synchronize threads in this process only.

Page 16: many to one

Synchronization Functions

Destroy a condition variables

int cond_destroy(cond_t *cv);

Wait for a condition

cond_t cv;

int cond_wait(cond_t *cv, mutex_t *mp);

Page 17: many to one

Synchronization Functions

cond_timewait(cond_t* cv, mutex_t *mp, timestruct_t abstime)

Wait for an absolute time

Signal one condition variable

int cond_signal(cond_t *cv); int cond_broadcast(cond_t * cv);

Page 18: many to one

Synchronization Functions

Semaphores

- initialize a semaphore - increment a semaphore - block a semaphore count - decrement a semaphore count - destroy a semaphore state

Page 19: many to one

Synchronization Functions

int sema_init(sema_t *sp, unsigned int count, int type, void* arg);

Initialize a semaphore

sema_t sp;int ret;int count;count = 4;

ret = sema_init(&sp, count, USYNC_THREAD, 0);

ret = sema_init(&sp, count, USYNC_PROCESS, 0);

Page 20: many to one

Synchronization Functions

Increment a semaphore count

int sema_post(sema_t *sp);

Decrement a semaphore count

int sema_trywait(sema_t* sp);

Destroy a semaphore

int sema_destroy(sema_t * sp);

Page 21: many to one

Synchronization Functions

Read-Write Locks

. Initialize a read-write lock

. Acquire a read lock

. Try to acquire a read lock

. Acquire a write lock

. Try to acquire a write lock

. Unlock a read-write lock

. Destroy read-write lock state

Page 22: many to one

Synchronization Functions

Initialize a read-write lock

rwlock_init(rwlock_t * rwlp, int type, void* arg); rwlock_t rwlp; int ret; ret = rw_lock_init(&rwlp, USYNC_THREAD, 0); ret = rw_lock_init(&rwlp, USYNC_PROCESS, 0); int rw_rdlock(rwlock_t *rwlp); int rw_tryrdlock(rwlock_t *rwlp); int rw_wrlock(rwlock_t *rwlp); int rw_trywrlock(rwlock_t *rwlp); int rw_unlock(rwlock_t *rwlp); int rw_destory(rwlock_t *rwlp);