#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); конечно