Thanks to visit codestin.com
Credit goes to www.scribd.com

0% found this document useful (0 votes)
53 views2 pages

Lab10 C

This document contains C code that uses threads to sum the elements of a large array in parallel. It defines the number of threads and array elements, creates thread structures passing element ranges, starts the threads to calculate partial sums, joins the threads to collect the results, and prints the total sum and execution time. Each thread sums its assigned range of array elements and adds the partial sum to the shared total.

Uploaded by

Zunair Nazir
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
53 views2 pages

Lab10 C

This document contains C code that uses threads to sum the elements of a large array in parallel. It defines the number of threads and array elements, creates thread structures passing element ranges, starts the threads to calculate partial sums, joins the threads to collect the results, and prints the total sum and execution time. Each thread sums its assigned range of array elements and adds the partial sum to the shared total.

Uploaded by

Zunair Nazir
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 2

#include <stdio.

h>
#include <stdlib.h>
#include <pthread.h>

#define MAX_NO_OF_THREADS 4
#define MAX_NO_OF_ELEMENTS 10000000

typedef struct arg_data {


int thread_number;
} arg_data;
static int arr[MAX_NO_OF_ELEMENTS];
static long long int sum;

void* worker_sum(void* arg)


{
arg_data* current_thread_data = (arg_data*)arg;

printf("Current thread no is : %d\n", current_thread_data->thread_number);

int endpart = (current_thread_data->thread_number) * (MAX_NO_OF_ELEMENTS /


MAX_NO_OF_THREADS);
int startpart = endpart - (MAX_NO_OF_ELEMENTS / MAX_NO_OF_THREADS);

printf("Here we will sum %d to %d\n", arr[startpart], arr[endpart - 1]);

long long int current_thread_sum = 0;


for (int i = startpart; i < endpart; i++) {
current_thread_sum += arr[i];
}
sum += current_thread_sum;

return NULL;
}

int main()
{

for (int i = 0; i < MAX_NO_OF_ELEMENTS; i++)


arr[i] = i + 1;

//pthread objects
pthread_t id[MAX_NO_OF_THREADS];

//argument data to send in worker functions


arg_data arg_arr[MAX_NO_OF_THREADS];

//total number of threads we will create


int no_of_threads = MAX_NO_OF_THREADS;
printf("Creating %d number of threads...\n", no_of_threads);

clock_t start, end;


double cpu_time_taken;

start = clock();

int thread_no = 1;

//creating the child threads


for (thread_no = 1; thread_no <= MAX_NO_OF_THREADS; thread_no++) {
arg_arr[thread_no - 1].thread_number = thread_no;
pthread_create(&id[thread_no - 1], NULL, worker_sum, &arg_arr[thread_no -
1]);
}

//joining the threads one by one


for (int i = 1; i <= MAX_NO_OF_THREADS; i++)
pthread_join(id[i - 1], NULL);

end = clock();
cpu_time_taken = ((double)(end - start)) / CLOCKS_PER_SEC;

printf("All child threads has finished their works...\n");

printf("Total sum: %lld\n", sum);

printf("Time taken to sum all the numbers are %lf\n", cpu_time_taken);

return 0;
}

You might also like