Problem 2. In addition to POSIX semaphores, the POSIX threads standard provides another useful synchronization primitives: the muter (type pthread_mutex_t) A mutex is used to wait for it implement mutual exclusion. A thread locks a mutex variable by calling pthread_mutex_lock(), and unlocks it by calling pthread_mutex_unlock(). When a thread calls pthread_mutex_lock() while another thread has previously locked the same mutex but not yet unlocked it, the former thread blocks until the latter thread calls pthread_mutex_unlock() on it. a. Is there any difference between a binary semaphore and a pthread_mutex? Justify your answer. b. Consider a program with multiple threads running this function: struct {...} shared_data; pthread_mutex_t m; void *thread_func(void *arg) { [update shared_data]; // critical section! return NULL; } Assume the mutex is initialized before the threads are created. Add the necessary pthread_mutex_* calls to the above code to ensure that only one thread is in the critical section at any time. c. Consider the program below, where ". . ." represents code that updates a shared data structure.

Systems Architecture
7th Edition
ISBN:9781305080195
Author:Stephen D. Burd
Publisher:Stephen D. Burd
Chapter11: Operating Systems
Section: Chapter Questions
Problem 14VE
icon
Related questions
Question
Problem 2. In addition to POSIX semaphores, the POSIX threads standard provides another
useful synchronization primitives: the muter (type pthread_mutex_t) A mutex is used to wait for
it implement mutual exclusion. A thread locks a mutex variable by calling pthread_mutex_lock(),
and unlocks it by calling pthread_mutex_unlock(). When a thread calls pthread_mutex_lock()
while another thread has previously locked the same mutex but not yet unlocked it, the former
thread blocks until the latter thread calls pthread_mutex_unlock() on it.
a. Is there any difference between a binary semaphore and a pthread_mutex? Justify your answer.
b. Consider a program with multiple threads running this function:
struct {...} shared_data;
pthread_mutex_t m;
void *thread_func(void *arg) {
[update shared_data]; // critical section!
return NULL;
}
Assume the mutex is initialized before the threads are created. Add the necessary pthread_mutex_*
calls to the above code to ensure that only one thread is in the critical section at any time.
c. Consider the program below, where "..." represents code that updates a shared data structure.
Transcribed Image Text:Problem 2. In addition to POSIX semaphores, the POSIX threads standard provides another useful synchronization primitives: the muter (type pthread_mutex_t) A mutex is used to wait for it implement mutual exclusion. A thread locks a mutex variable by calling pthread_mutex_lock(), and unlocks it by calling pthread_mutex_unlock(). When a thread calls pthread_mutex_lock() while another thread has previously locked the same mutex but not yet unlocked it, the former thread blocks until the latter thread calls pthread_mutex_unlock() on it. a. Is there any difference between a binary semaphore and a pthread_mutex? Justify your answer. b. Consider a program with multiple threads running this function: struct {...} shared_data; pthread_mutex_t m; void *thread_func(void *arg) { [update shared_data]; // critical section! return NULL; } Assume the mutex is initialized before the threads are created. Add the necessary pthread_mutex_* calls to the above code to ensure that only one thread is in the critical section at any time. c. Consider the program below, where "..." represents code that updates a shared data structure.
void *thread_func (void *arg) {
pthread_mutex_t mymutex;
int rv = pthread_mutex_init(&mymutex,NULL); // default attributes
}
rv = pthread_mutex_lock (&mymutex);
assert (!rv);
... // critical section
rv = pthread_mutex_unlock (&mymutex);
assert (!rv);
return NULL;
The main program creates and executes 4 threads running thread_func(). What is wrong
with the above code? (Hint: it has nothing to do with the variable rv or the call to assert.)
Transcribed Image Text:void *thread_func (void *arg) { pthread_mutex_t mymutex; int rv = pthread_mutex_init(&mymutex,NULL); // default attributes } rv = pthread_mutex_lock (&mymutex); assert (!rv); ... // critical section rv = pthread_mutex_unlock (&mymutex); assert (!rv); return NULL; The main program creates and executes 4 threads running thread_func(). What is wrong with the above code? (Hint: it has nothing to do with the variable rv or the call to assert.)
Expert Solution
trending now

Trending now

This is a popular solution!

steps

Step by step

Solved in 3 steps

Blurred answer
Knowledge Booster
Avoiding deadlock
Learn more about
Need a deep-dive on the concept behind this application? Look no further. Learn more about this topic, computer-science and related others by exploring similar questions and additional content below.
Similar questions
  • SEE MORE QUESTIONS
Recommended textbooks for you
Systems Architecture
Systems Architecture
Computer Science
ISBN:
9781305080195
Author:
Stephen D. Burd
Publisher:
Cengage Learning