⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dotprod_mutex.c

📁 Pthread lib库完整说明文档
💻 C
字号:
/****************************************************************************** FILE: dotprod_mutex.c* DESCRIPTION:*   This example program illustrates the use of mutex variables *   in a threads program. This version was obtained by modifying the*   serial version of the program (dotprod_serial.c) which performs a *   dot product. The main data is made available to all threads through *   a globally accessible  structure. Each thread works on a different *   part of the data. The main thread waits for all the threads to complete *   their computations, and then it prints the resulting sum.* SOURCE: Vijay Sonnad, IBM* LAST REVISED: 04/06/05 Blaise Barney******************************************************************************/#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.  This structure is unchanged from the sequential version.*/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;    pthread_t callThd[NUMTHRDS];   pthread_mutex_t mutexsum;/*The function dotprod is activated when the thread is created.As before, all input to this routine is obtained from a structure of type DOTDATA and all output from this function is written intothis structure. The benefit of this approach is apparent for the multi-threaded program: when a thread is created we pass a singleargument to the activated function - typically this argumentis a thread number. All  the other information required by the function is accessed from the globally accessible structure. */void *dotprod(void *arg){/* Define and use local variables for convenience */   int i, start, end, offset, len ;   double mysum, *x, *y;   offset = (int)arg;        len = dotstr.veclen;   start = offset*len;   end   = start + len;   x = dotstr.a;   y = dotstr.b;/*Perform the dot product and assign resultto 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 sharedstructure, and unlock it upon updating.*/   pthread_mutex_lock (&mutexsum);   dotstr.sum += mysum;   pthread_mutex_unlock (&mutexsum);   pthread_exit((void*) 0);}/* The main program creates threads which do all the work and then print out result upon completion. Before creating the threads,The input data is created. Since all threads update a shared structure, weneed a mutex for mutual exclusion. The main thread needs to wait forall threads to complete, it waits for each one of the threads. We specifya thread attribute value that allow the main thread to join with thethreads it creates. Note also that we free up handles  when they areno longer needed.*/int main (int argc, char *argv[]){int i;double *a, *b;int status;pthread_attr_t attr;/* 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;  b[i]=a[i];  }dotstr.veclen = VECLEN; dotstr.a = a; dotstr.b = b; dotstr.sum=0;pthread_mutex_init(&mutexsum, NULL);         /* Create threads to perform the dotproduct  */pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);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], &attr, dotprod, (void *)i);    }pthread_attr_destroy(&attr);/* Wait on the other threads */for(i=0;i<NUMTHRDS;i++) {  pthread_join( callThd[i], (void **)&status);  }/* After joining, print out the results and cleanup */printf ("Sum =  %f \n", dotstr.sum);free (a);free (b);pthread_mutex_destroy(&mutexsum);pthread_exit(NULL);}   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -