Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Modify the program to implement the strict alternation solution to achieve mutua

ID: 3883433 • Letter: M

Question

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).

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 20

Explanation / Answer

main.cpp

#include <iostream>

#include <pthread.h>

using namespace std;

int count;

int turn = 0;

void* myFunction(void* arg)

{

int actual_arg = *((int*) arg);

  

for(unsigned int i = 0; i < 10; ++i) {

  

  

while(turn != actual_arg);

  

  

count++;

std::cout << "Thread #" << actual_arg << " count = " << count << std::endl;

  

if(actual_arg == 0) {

turn = 1;

} else {

turn = 0;

}

  

}

  

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);

}

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote