Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // https://stackoverflow.com/questions/13741243/passing-data-between-thread-using-c-issue
- // https://stackoverflow.com/questions/13741243/passing-data-between-thread-using-c-issue
- // https://stackoverflow.com/questions/13741243/passing-data-between-thread-using-c-issue
- // https://stackoverflow.com/questions/13741243/passing-data-between-thread-using-c-issue
- #include <pthread.h>
- #include <stdio.h>
- #include <stdlib.h>
- /*
- The following structure contains the necessary information
- to allow the function "dotprod" to access its input data and
- place its output into the structure.
- */
- typedef struct
- {
- double *a;
- double *b;
- double sum;
- int veclen;
- } DOTDATA;
- /* Define globally accessible variables and a mutex */
- #define NUMTHRDS 4
- #define VECLEN 100
- DOTDATA dotstr; //GLOBAL DATA which is going to be accessed by different threads
- pthread_t callThd[NUMTHRDS];
- pthread_mutex_t mutexsum;
- void *dotprod(void *arg)
- {
- /* Define and use local variables for convenience */
- int i, start, end, len ;
- long offset;
- double mysum, *x, *y;
- offset = (long)arg;
- len = dotstr.veclen;
- start = offset*len;
- end = start + len;
- x = dotstr.a;
- y = dotstr.b;
- /*
- Perform the dot product and assign result
- to the appropriate variable in the structure.
- */
- mysum = 0;
- for (i=start; i<end ; i++)
- {
- mysum += (x[i] * y[i]);
- }
- /*
- Lock a mutex prior to updating the value in the shared
- structure, and unlock it upon updating.
- */
- pthread_mutex_lock (&mutexsum);
- dotstr.sum += mysum;
- pthread_mutex_unlock (&mutexsum);
- pthread_exit((void*) 0);
- }
- int main (int argc, char *argv[])
- {
- long i;
- double *a, *b;
- void *status;
- /* Assign storage and initialize values */
- a = (double*) malloc (NUMTHRDS*VECLEN*sizeof(double));
- b = (double*) malloc (NUMTHRDS*VECLEN*sizeof(double));
- for (i=0; i<VECLEN*NUMTHRDS; i++)
- {
- a[i]=1.0;
- b[i]=a[i];
- }
- dotstr.veclen = VECLEN;
- dotstr.a = a;
- dotstr.b = b;
- dotstr.sum=0;
- pthread_mutex_init(&mutexsum, NULL);
- for(i=0; i<NUMTHRDS; i++)
- {
- /*
- Each thread works on a different set of data.
- The offset is specified by 'i'. The size of
- the data for each thread is indicated by VECLEN.
- */
- pthread_create(&callThd[i], NULL, dotprod, (void *)i);
- }
- /* Wait on the other threads */
- for(i=0; i<NUMTHRDS; i++)
- {
- pthread_join(callThd[i], &status);
- }
- printf ("Sum = %f \n", dotstr.sum);
- free (a);
- free (b);
- pthread_mutex_destroy(&mutexsum);
- pthread_exit(NULL);//No need of pthread_join() if pthread_exit() used.
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement