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.

Database System Concepts
7th Edition
ISBN:9780078022159
Author:Abraham Silberschatz Professor, Henry F. Korth, S. Sudarshan
Publisher:Abraham Silberschatz Professor, Henry F. Korth, S. Sudarshan
Chapter1: Introduction
Section: Chapter Questions
Problem 1PE
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.
Recommended textbooks for you
Database System Concepts
Database System Concepts
Computer Science
ISBN:
9780078022159
Author:
Abraham Silberschatz Professor, Henry F. Korth, S. Sudarshan
Publisher:
McGraw-Hill Education
Starting Out with Python (4th Edition)
Starting Out with Python (4th Edition)
Computer Science
ISBN:
9780134444321
Author:
Tony Gaddis
Publisher:
PEARSON
Digital Fundamentals (11th Edition)
Digital Fundamentals (11th Edition)
Computer Science
ISBN:
9780132737968
Author:
Thomas L. Floyd
Publisher:
PEARSON
C How to Program (8th Edition)
C How to Program (8th Edition)
Computer Science
ISBN:
9780133976892
Author:
Paul J. Deitel, Harvey Deitel
Publisher:
PEARSON
Database Systems: Design, Implementation, & Manag…
Database Systems: Design, Implementation, & Manag…
Computer Science
ISBN:
9781337627900
Author:
Carlos Coronel, Steven Morris
Publisher:
Cengage Learning
Programmable Logic Controllers
Programmable Logic Controllers
Computer Science
ISBN:
9780073373843
Author:
Frank D. Petruzella
Publisher:
McGraw-Hill Education