Created
March 12, 2010 16:42
-
-
Save yeban/330502 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* ===================================================================================== | |
* | |
* Filename: threads.c | |
* | |
* Description: Familiarising with pthreads. | |
* | |
* Version: 1.0 | |
* Created: Thursday 11 March 2010 01:25:12 IST | |
* Revision: none | |
* Compiler: gcc | |
* | |
* Author: Anurag Priyam (yeban), anurag08priyam@gmail.com | |
* Company: IIT Kharagpur | |
* | |
* ===================================================================================== | |
*/ | |
#include <stdio.h> | |
#include <pthread.h> | |
#include <stdlib.h>//for EXIT_FAILURE | |
#define MAX_N 100 | |
#define MAX_NUMBER 500 | |
typedef struct { | |
int n, p, segment; | |
int *array; | |
} arguments; | |
void bubble_sort(int *array, int size){ | |
int i, j, temp; | |
for(i = 1; i < size; i++){ | |
for(j = 0; j < size - i; j++){ | |
if(array[j] > array[j+1]){ | |
temp = array[ j ]; | |
array[ j ] = array[ j + 1 ]; | |
array[ j + 1 ] = temp; | |
} | |
} | |
} | |
} | |
//perform sorting on each segment by calling | |
//bubble_sort with the right arguments, i.e, | |
//pointer to the start of each segment and the size of the segment | |
void* sort( void *args ){ | |
arguments *args_sort = ( arguments* )args; | |
long tid; | |
int first = 0; | |
for( tid = 0; tid < args_sort->p; tid++ ){ | |
bubble_sort( args_sort->array + first, args_sort->segment ); | |
first += args_sort->segment; | |
} | |
} | |
int main(){ | |
arguments args; | |
int error; | |
//seed the random number generator | |
srandom( time( NULL ) ); | |
//get n and p | |
args.n = random() % MAX_N + 1; | |
printf( "Enter a factor of %d: ", args.n ); | |
scanf( "%d", &args.p ); | |
//compute segment size | |
args.segment = args.n/args.p; | |
//populate the array | |
int i; | |
args.array = calloc( args.n, sizeof( int ) ); | |
for( i = 0; i < args.n; i++ ){ | |
args.array[ i ] = random() % MAX_NUMBER + 1; | |
} | |
//thread creation variables | |
pthread_t threads[ args.p ]; | |
pthread_attr_t attr; | |
long tid; | |
//set thread detached attribute | |
pthread_attr_init( &attr ); | |
pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE ); | |
//create the threads | |
for( tid = 0; tid < args.p; tid++ ){ | |
if( error = pthread_create( &threads[ tid ], &attr, sort, ( void* )&args ) ){ | |
printf( "Creating thread: %s\n", strerror( error ) ); | |
exit( EXIT_FAILURE ); | |
} | |
} | |
//free attr and | |
//wait for the threads to complete | |
pthread_attr_destroy( &attr ); | |
for( tid = 0; tid < args.p; tid++ ){ | |
if( error = pthread_join( threads[ tid ], NULL ) ){ | |
printf( "Joining thread: %s\n", strerror( error ) ); | |
exit( EXIT_FAILURE ); | |
} | |
} | |
//the segments will have been sorted | |
//display each sorted segment | |
int first = 0, last = args.segment; | |
for( tid = 0; tid < args.p; tid++ ){ | |
printf( "Sorted segment of thread %d\n", tid ); | |
for(i = first; i < last; i++ ){ | |
printf( "%d ", args.array[ i ] ); | |
} | |
printf( "\n" ); | |
first = last; last += args.segment; | |
} | |
free( args.array ); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment