Simple Multi-threaded Programming using Pthreads The purpose of this exercise is
ID: 3911122 • Letter: S
Question
Simple Multi-threaded Programming using Pthreads
The purpose of this exercise is for you to get some experience using the threads primitives provided by Pthreads [1], and to demonstrate what happens if concurrently executing threads access shared variables without proper synchronization. Then you will use the mutex synchronization primitives in Pthread library to achieve proper synchronization.
Task 1.1: Simple Multi-threaded Programming without Synchronization - Weight: 4%
First, you need to write a C program using the Pthread library to spawn a number of threads each of which executes the loop in the SimpleThread function below. The number of threads to create is a command line parameter passed to your program. All the threads modify a shared variable SharedVariable and display its value within and after the loop.
int SharedVariable = 0;
void SimpleThread(int which) {
int num, val = 0;
for(num = 0; num < 20; num++) {
if (random() > RAND_MAX / 2)
usleep(10);
val = SharedVariable;
printf("*** thread %d sees value %d ", which, val); SharedVariable = val + 1;
}
val = SharedVariable;
printf("Thread %d sees final value %d ", which, val);
}
Your program must validate the command line parameter to make sure that it is a number.
Your program must be able to run properly with any reasonable number of threads (e.g., 200).
Try your program with the command line parameter set to 1, 2, 5, 10, and 50. Analyze and explain the results.
Explanation / Answer
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int SharedVariable = 0;
void * SimpleThread(int which) {
int num, val = 0;
for(num = 0; num < 20; num++) {
if (random() > RAND_MAX / 2)
usleep(10);
val = SharedVariable;
printf("*** thread %d sees value %d ", which, val); SharedVariable = val + 1;
}
val = SharedVariable;
printf("Thread %d sees final value %d ", which, val);
}
int main(int argc, char** argv)
{
int j=0, isDigit=1;
while(j<strlen(argv[1])){
isDigit = isdigit(argv[1][j]);
if (isDigit == 0) break;
j++;
}
if( isDigit==1)
{
int num_threads = atoi(argv[1]); // Convert first argument to integer.
pthread_t threads[num_threads];
int args[num_threads];
for (int i = 0; i < num_threads; i++)
{
args[i] = i+1;
if(pthread_create(&threads[i], NULL, SimpleThread, &args[i]) !=0)
{
printf("error: Cannot create thread # %d ", i+1);
break;
}
}
for(int i = 0; i < num_threads; i++)
if(pthread_join(threads[i], NULL) !=0)
printf( "error: Cannot join thread # %d ", i+1);
}
else
printf("Enter a valid number for number of threads to be created ");
return 0;
}
Output with 10 threads:
*** thread 14731060 sees value 0
*** thread 14731056 sees value 0
*** thread 14731060 sees value 1
*** thread 14731060 sees value 2
*** thread 14731060 sees value 3
*** thread 14731060 sees value 4
*** thread 14731056 sees value 2
*** thread 14731056 sees value 3
*** thread 14731068 sees value 4
*** thread 14731072 sees value 5
*** thread 14731064 sees value 3
*** thread 14731056 sees value 5
*** thread 14731068 sees value 5
*** thread 14731064 sees value 4
*** thread 14731064 sees value 5
*** thread 14731064 sees value 6
*** thread 14731064 sees value 7
*** thread 14731060 sees value 6
.......................
*** thread 14731056 sees value 22
*** thread 14731056 sees value 23
*** thread 14731068 sees value 17
*** thread 14731060 sees value 17
*** thread 14731064 sees value 17
*** thread 14731064 sees value 18
*** thread 14731048 sees value 17
*** thread 14731048 sees value 18
*** thread 14731052 sees value 17
.............................
*** thread 14731076 sees value 17
*** thread 14731072 sees value 20
*** thread 14731052 sees value 20
*** thread 14731052 sees value 21
*** thread 14731056 sees value 20
*** thread 14731060 sees value 20
*** thread 14731060 sees value 21
*** thread 14731076 sees value 21
*** thread 14731076 sees value 22
*** thread 14731076 sees value 23
*** thread 14731056 sees value 21
*** thread 14731072 sees value 21
*** thread 14731072 sees value 22
*** thread 14731072 sees value 23
*** thread 14731052 sees value 21
*** thread 14731052 sees value 22
*** thread 14731056 sees value 25
*** thread 14731056 sees value 26
*** thread 14731060 sees value 25
*** thread 14731052 sees value 25
*** thread 14731072 sees value 26
*** thread 14731072 sees value 27
*** thread 14731072 sees value 28
*** thread 14731076 sees value 28
*** thread 14731056 sees value 29
Thread 14731056 sees final value 30
*** thread 14731072 sees value 30
............................
*** thread 14731068 sees value 34
*** thread 14731068 sees value 35
*** thread 14731068 sees value 36
*** thread 14731068 sees value 37
,,,,,,,,,,,,,,,,,,,,,,,,
*** thread 14731048 sees value 49
*** thread 14731052 sees value 49
*** thread 14731052 sees value 50
*** thread 14731044 sees value 51
*** thread 14731044 sees value 52
*** thread 14731044 sees value 53
*** thread 14731052 sees value 54
*** thread 14731064 sees value 55
*** thread 14731048 sees value 56
*** thread 14731044 sees value 57
*** thread 14731052 sees value 58
*** thread 14731052 sees value 59
*** thread 14731052 sees value 60
Thread 14731052 sees final value 61
*** thread 14731064 sees value 58
*** thread 14731048 sees value 59
*** thread 14731048 sees value 60
*** thread 14731048 sees value 61
*** thread 14731048 sees value 62
*** thread 14731048 sees value 63
*** thread 14731044 sees value 64
*** thread 14731040 sees value 65
*** thread 14731064 sees value 66
Thread 14731064 sees final value 67
*** thread 14731048 sees value 67
*** thread 14731048 sees value 68
*** thread 14731048 sees value 69
*** thread 14731044 sees value 70
*** thread 14731044 sees value 71
*** thread 14731040 sees value 72
*** thread 14731040 sees value 73
*** thread 14731048 sees value 74
*** thread 14731048 sees value 75
*** thread 14731044 sees value 76
*** thread 14731044 sees value 77
*** thread 14731044 sees value 78
,,,,,,,,,,,,
If we see the value of sharedvariable is inconsistent.
Ex:
*** thread 14731052 sees value 58
*** thread 14731052 sees value 59
*** thread 14731052 sees value 60
Thread 14731052 sees final value 61
*** thread 14731064 sees value 58
*** thread 14731048 sees value 59
Eventhough thread 14731052 sees final value as 61 , the other thread 14731064 sees the value of shared variable as 58(very old value of shared variable) and uses this as new value. Hence the value it takes is not correct one.
Therefore proper synchronization is required to get the expected results
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.