Part 3: Strict Alternation (10 points) A file named pthread-data-sharing-mutex-s
ID: 3753632 • Letter: P
Question
Part 3: Strict Alternation (10 points)
A file named pthread-data-sharing-mutex-strict-alternation.cpp has been provided to you in the same project.
Compile the program and make sure that it executes.
Examine the program code. Note that except for some minor changes, this program is identical to the one you used in Part 2 of this assignment.
Modify the program to implement the strict alternation solution to achieve mutual exclusion (refer back to the relevant prep work video/slides if you need to).
Build and execute the updated program several times.
Expected Output:
Your program should produce the following output
Base Code:
#include <iostream>
#include <pthread.h>
int count;
int turn = 0; // Shared variable used to implement strict alternation
void* myFunction(void* arg)
{
int actual_arg = *((int*) arg);
for(unsigned int i = 0; i < 10; ++i)
{
// TODO:
// Make sure that the thread waits for its turn
// before it enters the critical region.
//
// HINT: The thread ID is stored in actual_arg
// Beginning of the critical region
count++;
std::cout << "Thread #" << actual_arg << " count = " << count << std::endl;
// End of the critical region
// TODO:
// Make sure that the other thread gets a turn
//
// HINT: There are only two threads: 0 and 1
// You can use the C++ NOT operator (!)
// to toggle back and forth.
}
pthread_exit(NULL);
}
// HINT: It is not necessary to make any changes in main()
int main()
{
int rc[2];
pthread_t ids[2];
int args[2];
count = 0;
for(unsigned int i = 0; i < 2; ++i) {
args[i] = i;
rc[i] = pthread_create(&ids[i], NULL, myFunction, (void*) &args[i]);
}
for(unsigned int i = 0; i < 2; ++i) {
pthread_join(ids[i], NULL);
}
std::cout << "Final count = " << count << std::endl;
pthread_exit(NULL);
}
Thread #0 count - 1 Thread #1 count = 2 Thread #0 count 3 Thread #1 count = 4 Thread #0 count = 5 Thread #1 count 6 Thread #0 count = 7 Thread #1 count = 8 Thread #0 count 9 Thread #1 count = 10 Thread #0 count = 11 Thread #1 count = 12 Thread #0 count - 13 Thread #1 count - 14 Thread #0 count 15 Thread #1 count = 16 Thread #0 count 17 Thread #1 count 18 Thread #0 count = 19 Thread #1 count 20 Final count 20Explanation / Answer
#include <iostream>
#include <pthread.h>
#define TOTAL_THREADS 2
int count;
int turn; // Shared variable, indicates
// whose turn it is to execute
bool interested[TOTAL_THREADS]; // Shared variable, indicates
// processes interested in executing
// The thread_id will be either 0 or 1
void enter_region(int thread_id)
{
int other; // ID of the other thread
other = 1 - thread_id; // The oposite of thread_id
// TODO: Add the code to indicate the
// thread's interest in executing.
interested[thread_id]=1;
// TODO: Indicate the thread's turn to execute next
turn=thread_id;
// TODO: Busy wait until it is the thread's turn to execute
while (turn==thread_id && interested[other]==1); //null statement, busy wait
}
void leave_region(int thread_id)
{
// TODO: Add the code to set the flag
// indicating that the thread has
// exited the critical region.
interested[thread_id]=0;
}
void myFunction(void arg)
{
int thread_id = ((int) arg);
for(unsigned int i = 0; i < 10; ++i) {
// TODO:
// Make sure that the thread waits for its turn
// before it enters the critical region.
//
// HINT: You need one function call
enter_region(thread_id);
// Beginning of the critical region
count++;
std::cout << "Thread #" << thread_id << " count = " << count << std::endl;
// End of the critical region
leave_region(thread_id);
// TODO:
// Make sure that the other thread gets a turn
//
// HINT: You need one function call
}
pthread_exit(NULL);
}
// HINT: It is not necessary to make any changes in main()
int main()
{
int rc[TOTAL_THREADS];
pthread_t ids[TOTAL_THREADS];
int args[TOTAL_THREADS];
count = 0;
for(unsigned int i = 0; i < TOTAL_THREADS; ++i) {
args[i] = i;
rc[i] = pthread_create(&ids[i], NULL, myFunction, (void*) &args[i]);
}
for(unsigned int i = 0; i < TOTAL_THREADS; ++i) {
pthread_join(ids[i], NULL);
}
std::cout << "Final count = " << count << std::endl;
pthread_exit(NULL);
}