6

C言語を使用してスレッド間でデータを渡す方法を知りたい。

例:Xはどこかからのメッセージを待ちます。
YはTXにイベントに関するメッセージを送信し、応答を待ちます。
TXはイベントを処理し、TYに応答を送信します。
TXは別のメッセージを待ちます。

4

2 に答える 2

9

https://computing.llnl.gov/tutorials/pthreads/#Mutexesから取得して変更したサンプルプログラム。これは、グローバルに宣言されたデータを複数のスレッドで使用する方法を示しています。

#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.
}   
于 2012-12-06T10:24:56.717 に答える
0

スレッドは同じメモリスペースを共有しているため、通常の変数を使用してスレッド間でデータを共有できます。

あなたはまた、あるイベントを待っているスレッドについて言及しています、これは別の話です-同期。この目的のために、例えばミューテックスを使用することができます。

于 2012-12-06T10:15:03.777 に答える