Поток, вызывающий функцию постановки в очередь на C

#c #multithreading #queue

#c #многопоточность #очередь

Вопрос:

У меня есть:

 struct elem {                  
   data          d;
   struct elem   *next;
};

typedef   struct elem   elem;

struct queue {
   int    cnt;                  
   elem   *front;              
   elem   *rear;               
};

void enqueue(data d, queue *q);

void enqueue(data d, queue *q)
{
   elem   *p;
   p = malloc(sizeof(elem));
   p -> d = d;
   p -> next = NULL;
   if (!empty(q)) {
      q -> rear -> next = p;
      q -> rear = p;
   }
   else
      q -> front = q -> rear = p;
   q -> cnt  ;
}
  

который будет вызывать:

 int main(){
   struct queue Q;
   initialize(amp;Q); //init the queue
   enqueue( 10000, amp;Q);  
return 0;
}
  

и создание некоторого потока, подобного:

    #include <pthread.h>
   #include <stdio.h>
   #include <stdlib.h>
   #define NUM_THREADS 5
   /**
    * 
    *
    */
  pthread_t threads[NUM_THREADS];
  long t;
  for(t=0;t<NUM_THREADS;t  ){
      pthread_create(amp;threads[t], NULL, enqueue, (void *)t);
  }
  

Как я должен изменить функцию постановки в очередь, чтобы в pthread_create каждый вызов потока

 enqueue( variable, amp;Q);  
  

(Я создаю очередь без блокировки, и у нее уже есть логика, но я застрял в том, как каждый поток будет вызывать функцию постановки в очередь …)

—РЕДАКТИРОВАТЬ—

Я выполняю предложенный ответ и получаю:

     queue.c: In function ‘main’:
    queue.c:130: warning: passing argument 3 of ‘pthread_create’
    from incompatible pointer type /usr/include/pthread.h:227: 
    note: expected ‘void * (*)(void *)’ but argument is of type ‘void (*)(data,  struct queue *)’
  

Ответ №1:

Есть пример, без какой-либо проверки ошибок и т.д. Кроме того, если вы используете поток, вам следует использовать мьютекс, чтобы предотвратить одновременный доступ к вашей очереди (или использовать какой-нибудь алгоритм без блокировки). Просто добавьте следующие изменения:

 struct thread_data {
    data          d;
    struct queue *q;
};

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
struct queue Q;

void* thread_func(void* a)
{
    struct thread_data *t = (struct thread_data *)a;

    pthread_mutex_lock(amp;mutex); // Just example, better use Lock in enqueue
    enqueue(t->d, t->q);
    pthread_mutex_unlock(amp;mutex);

    free(t);
    return NULL;
}

int main(){
    pthread_t threads[NUM_THREADS];
    long t; // I hope you will initialize it in some proper way

    initialize(amp;Q); //init the queue
    for(t=0;t<NUM_THREADS;t  ){
        struct thread_data *arg = (struct thread_data *) malloc(sizeof(struct thread_data));
        arg->q = amp;Q;
        arg->d = t; // Actually it is should be your data
        pthread_create(amp;threads[t], NULL, thread_func, (void *)arg); //FIXED: thread_func is the thread function
    }

    return 0;
}
  

Комментарии:

1. Варианты, извините, должны быть pthread_create(amp;threads[t], NULL, thread_func (void *)arg); конечно