Lab7 and Lab8
Lab7 and Lab8
Course Instructor
Ms. Zahida Walayat
Submitted by:
Section: BCS-5B
Task 1(lab-7):
#include <iostream>
#include <sys/wait.h>
#include <unistd.h>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <climits>
if (guess == random_number) {
std::cout << "Child " << child_num << ": Correct! You guessed the number in "
<< turns << " turns.\n";
} else {
std::cout << "Child " << child_num << ": Wrong guess. Try again.\n";
}
}
int main() {
const int NUM_CHILDREN = 3;
int pipe_fd[NUM_CHILDREN][2];
pid_t pid[NUM_CHILDREN];
pid[i] = fork();
if (pid[i] < 0) {
std::cerr << "Fork failed\n";
return 1;
}
if (pid[i] == 0) {
// Child process
child_process(pipe_fd[i], i + 1);
}
}
// Parent process
for (int i = 0; i < NUM_CHILDREN; ++i) {
close(pipe_fd[i][1]); // Close write end of pipe in parent process
}
int turns;
read(pipe_fd[i][0], &turns, sizeof(turns));
close(pipe_fd[i][0]); // Close read end of pipe in parent process
std::cout << "Child " << (i + 1) << " took " << turns << " turns to guess correctly.\
n";
if (turns < min_turns) {
min_turns = turns;
winner = i + 1;
}
}
std::cout << "The winner is Child " << winner << " with " << min_turns << " turns!\
n";
return 0;
}
Task 2(lab-8):
#include <iostream>
#include <vector>
#include <thread>
#include <chrono>
#include <random>
#include <cmath>
#include <mutex>
void populate_array() {
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(1, MAX_RANDOM);
for (int i = 0; i < ARRAY_SIZE; ++i) {
numbers[i] = dis(gen);
}
}
bool is_prime_number(int n) {
if (n <= 1) return false;
if (n <= 3) return true;
if (n % 2 == 0 || n % 3 == 0) return false;
for (int i = 5; i * i <= n; i += 6) {
if (n % i == 0 || n % (i + 2) == 0) return false;
}
return true;
}
void calculate_factorials() {
for (int i = 0; i < ARRAY_SIZE; ++i) {
factorials[i] = factorial(numbers[i]);
}
}
void check_primes() {
for (int i = 0; i < ARRAY_SIZE; ++i) {
is_prime[i] = is_prime_number(numbers[i]);
}
}
int count_primes() {
int count = 0;
for (int i = 0; i < ARRAY_SIZE; ++i) {
if (is_prime[i]) {
++count;
}
}
return count;
}
int main() {
// Single-threaded approach
populate_array();
// Multi-threaded approach
populate_array(); // Repopulate the array for a fair comparison
std::thread factorial_thread(calculate_factorials);
std::thread prime_thread(check_primes);
start = std::chrono::high_resolution_clock::now();
factorial_thread.join();
prime_thread.join();
end = std::chrono::high_resolution_clock::now();
// Compare performance
if (duration_single_thread.count() < duration_multi_thread.count()) {
std::cout << "Single-threaded approach is faster.\n";
} else {
std::cout << "Multi-threaded approach is faster.\n";
}
return 0;
}