Implement this in C using pthreads Youll have to use Cygwin
Implement this in C++ using pthreads. (You\'ll have to use Cygwin or something similar if you\'re on Windows.)
You will have one shared variable that is modi ed called sum. In each thread, check a number and add it to sum if it is a factor of N (N is a random number).
You check to see if a number is a factor using the modulo operator. You\'ll need to protect access to sum using a mutex.
You\'ll also have a shared variable N, but no threads will modify it so it doesn\'t need to be protected.
Start with P = 1 to get things working. That way you won\'t have any race conditions.
You can cast an integer to a void* with the code (void*)(size t)N.
You can join a thread that has never been started and it will return immediately.
Please Use the following starter code to complete your answer
#include
#include
#include
int N;
int main(int argc, char **argv) {
if (argc < 3) {
printf(\"Usage: perfect N P\ \");
return 1;
}
N = atoi(argv[1]);
const int P = atoi(argv[2]);
printf(\"N = %d, P = %d\ \", N, P);
}
Solution
#include <iostream>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<stdio.h>
#include <errno.h>
//define MAX to hold number of thread
#define MAX 100
using namespace std;
int N;
void* thread_func(void *arg);
int sum;
int main(int argc, char **argv)
{
//We will store the thread IDs in an array
pthread_t thread[MAX];
if (argc < 3)
{
printf(\"Usage: perfect N P\ \");
return 1;
}
N = atoi(argv[1]);
const int P = atoi(argv[2]);
printf(\"N = %d, P = %d\ \", N, P);
//create P number of threads
for(int i = 0; i < P ; i++)
{
int err = pthread_create(&(thread[0]), NULL, &thread_func, (void*)&N);
if (err != 0)
printf(\"\ can\'t create thread \ \");
else
printf(\"\ Thread created successfully\ \");
}
//join threads
for(int i = 0; i < P ; i++)
{
pthread_join(thread[0],NULL);
}
printf(\"sum after executing all the thread = %d\ \",sum);
}
pthread_mutex_t count_mutex;
void* thread_func(void *arg)
{
//check if sum is factor of N
if( sum%N == 0)
{
//lock before adding to sum as sum is shared variable
pthread_mutex_lock(&count_mutex);
sum+=N;
//unloack after adding
printf(\"Adding %d Number to sum\ \",N);
printf(\"sum in thread = %d\ \",sum);
pthread_mutex_unlock(&count_mutex);
}
}
-----------------------------------------------------------------------------------------------------------------
//output
N = 5, P = 50
Thread created successfully
Thread created successfully
Adding 5 Number to sum
sum in thread = 5
Adding 5 Number to sum
sum in thread = 10
Thread created successfully
Adding 5 Number to sum
sum in thread = 15
Thread created successfully
Thread created successfully
Adding 5 Number to sum
sum in thread = 20
Adding 5 Number to sum
sum in thread = 25
Thread created successfully
Adding 5 Number to sum
sum in thread = 30
Thread created successfully
Adding 5 Number to sum
sum in thread = 35
Thread created successfully
Adding 5 Number to sum
sum in thread = 40
Thread created successfully
Adding 5 Number to sum
sum in thread = 45
Thread created successfully
Adding 5 Number to sum
sum in thread = 50
Thread created successfully
Adding 5 Number to sum
sum in thread = 55
Thread created successfully
Adding 5 Number to sum
sum in thread = 60
Thread created successfully
Adding 5 Number to sum
sum in thread = 65
Thread created successfully
Adding 5 Number to sum
sum in thread = 70
Thread created successfully
Adding 5 Number to sum
sum in thread = 75
Thread created successfully
Adding 5 Number to sum
sum in thread = 80
Thread created successfully
Adding 5 Number to sum
sum in thread = 85
Thread created successfully
Adding 5 Number to sum
sum in thread = 90
Thread created successfully
Adding 5 Number to sum
sum in thread = 95
Thread created successfully
Adding 5 Number to sum
sum in thread = 100
Thread created successfully
Adding 5 Number to sum
sum in thread = 105
Thread created successfully
Adding 5 Number to sum
sum in thread = 110
Thread created successfully
Adding 5 Number to sum
sum in thread = 115
Thread created successfully
Adding 5 Number to sum
sum in thread = 120
Thread created successfully
Adding 5 Number to sum
sum in thread = 125
Thread created successfully
Adding 5 Number to sum
sum in thread = 130
Thread created successfully
Adding 5 Number to sum
sum in thread = 135
Thread created successfully
Adding 5 Number to sum
sum in thread = 140
Thread created successfully
Adding 5 Number to sum
sum in thread = 145
Thread created successfully
Adding 5 Number to sum
sum in thread = 150
Thread created successfully
Adding 5 Number to sum
sum in thread = 155
Thread created successfully
Adding 5 Number to sum
sum in thread = 160
Thread created successfully
Adding 5 Number to sum
sum in thread = 165
Thread created successfully
Adding 5 Number to sum
sum in thread = 170
Thread created successfully
Adding 5 Number to sum
sum in thread = 175
Thread created successfully
Adding 5 Number to sum
sum in thread = 180
Thread created successfully
Adding 5 Number to sum
sum in thread = 185
Thread created successfully
Adding 5 Number to sum
sum in thread = 190
Thread created successfully
Adding 5 Number to sum
sum in thread = 195
Thread created successfully
Adding 5 Number to sum
sum in thread = 200
Thread created successfully
Adding 5 Number to sum
sum in thread = 205
Thread created successfully
Adding 5 Number to sum
sum in thread = 210
Thread created successfully
Adding 5 Number to sum
sum in thread = 215
Thread created successfully
Adding 5 Number to sum
sum in thread = 220
Thread created successfully
Adding 5 Number to sum
sum in thread = 225
Thread created successfully
Adding 5 Number to sum
sum in thread = 230
Thread created successfully
Adding 5 Number to sum
sum in thread = 235
Thread created successfully
Adding 5 Number to sum
sum in thread = 240
Thread created successfully
Adding 5 Number to sum
sum in thread = 245
Thread created successfully
Adding 5 Number to sum
sum in thread = 250
sum after executing all the thread = 250




