Поток вызова функции в C - PullRequest
0 голосов
/ 24 мая 2011

у меня есть:

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(&Q); //init the queue
   enqueue( 10000, &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(&threads[t], NULL, enqueue, (void *)t);
  }

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

enqueue( variable, &Q);  

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

- EDIT -

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

    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 Ответ

3 голосов
/ 24 мая 2011

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

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(&mutex); // Just example, better use Lock in enqueue
    enqueue(t->d, t->q);
    pthread_mutex_unlock(&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(&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 = &Q;
        arg->d = t; // Actually it is should be your data
        pthread_create(&threads[t], NULL, thread_func, (void *)arg); //FIXED: thread_func is the thread function
    }

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...