Passing Data between thread using C issue

后端 未结 2 1538
臣服心动
臣服心动 2021-01-12 18:48

I want know how to pass data between threads using C language.

For example:X waits for a message from somewhere.
Y sends T-X a message about an

相关标签:
2条回答
  • 2021-01-12 19:45

    Threads are sharing the same memory space so you can use ordinary variable to share data between threads.

    You are also mentioning about thread waiting for some event, this is another story - synchronization. For this purpose you can use mutexses for example.

    0 讨论(0)
  • 2021-01-12 19:51

    a sample program taken from https://computing.llnl.gov/tutorials/pthreads/#Mutexes and modified. This shows, how to use a globally declared data in multiple threads.

    #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.
    }   
    
    0 讨论(0)
提交回复
热议问题