#include #include #include #include #define NUM_THREADS 4 long long num_steps = 1000000000; double step; double global_sum = 0.0; pthread_mutex_t mutex; void *compute_pi(void *arg) { int thread_id = *(int *)arg; double local_sum = 0.0; long long start = thread_id * (num_steps / NUM_THREADS); long long end = (thread_id + 1) * (num_steps / NUM_THREADS); if (thread_id == NUM_THREADS - 1) end = num_steps; // Handle remainder for (long long i = start; i < end; i++) { double x = (i + 0.5) * step; local_sum += 4.0 / (1.0 + x * x); } pthread_mutex_lock(&mutex); global_sum += local_sum; pthread_mutex_unlock(&mutex); return NULL; } int main(int argc, char* argv[]) { struct timeval TimeStampStart, TimeStampStop; double ExeTime; double pi; int thread_ids[NUM_THREADS]; pthread_t threads[NUM_THREADS]; step = 1.0 / (double)num_steps; // Initialize mutex pthread_mutex_init(&mutex, NULL); gettimeofday(&TimeStampStart, NULL); // Create threads for (int i = 0; i < NUM_THREADS; i++) { thread_ids[i] = i; pthread_create(&threads[i], NULL, compute_pi, &thread_ids[i]); } // Wait for threads for (int i = 0; i < NUM_THREADS; i++) { pthread_join(threads[i], NULL); } pi = global_sum * step; gettimeofday(&TimeStampStop, NULL); ExeTime = (double)(TimeStampStop.tv_sec - TimeStampStart.tv_sec) + (double)(TimeStampStop.tv_usec - TimeStampStart.tv_usec) * 1e-6; // Destroy mutex pthread_mutex_destroy(&mutex); printf("The value of PI is %15.12f\n", pi); printf("The time to calculate PI was %f seconds\n", ExeTime); return 0; }