История изменений
Исправление iron, (текущая версия) :
У меня была подобная задача: куча тредов складывают задачи в очередь а тред из пула тредов берет задачу и обрабатывает. Схема работы примерно такая:
В потоках обрабатывающих запросы вызывается submitTask(data)
где data
указатель на структуру с данными для обработки.
int submitTask(client_data *data) {
pthread_mutex_lock(&mutexQueue);
if (taskCount > MAX_QUEUE_SIZE - 1 ) {
logger(ERROR, "Cannot process request, processing queue is full!\n", "");
pthread_mutex_unlock(&mutexQueue);
pthread_cond_signal(&condQueue);
return 1;
}
taskQueue[taskCount] = data;
taskCount++;
pthread_mutex_unlock(&mutexQueue);
pthread_cond_signal(&condQueue);
return 0;
}
В каждом треде процессинга:
while (true) {
...
// ----------------Begin Critical section --------------------
pthread_mutex_lock(&mutexQueue);
while (taskCount == 0 && !quit_signal) {
pthread_cond_wait(&condQueue, &mutexQueue);
}
if (!quit_signal) {
data = taskQueue[0];
for (register int i = 0; i < taskCount - 1; i++) {
taskQueue[i] = taskQueue[i + 1];
}
taskCount--;
} else {
pthread_mutex_unlock(&mutexQueue);
goto thread_exit;
}
pthread_mutex_unlock(&mutexQueue);
// ----------------End Critical section -----------------------
...
}
Работает как швейцарские часы (с).
Исходная версия iron, :
У меня была подобная задача: куча тредов складывают задачи в очередь а тред из пула тредов берет задачу и обрабатывает. Схема работы примерно такая:
В потоках обрабатывающих запросы вызывается submitTask(data)
где data
указатель на структуру с данными для обработки.
int submitTask(client_data *data) {
pthread_mutex_lock(&mutexQueue);
if (taskCount > MAX_QUEUE_SIZE - 1 ) {
logger(ERROR, "Cannot process request, processing queue is full!\n", "");
pthread_mutex_unlock(&mutexQueue);
pthread_cond_signal(&condQueue);
return 1;
}
taskQueue[taskCount] = data;
taskCount++;
pthread_mutex_unlock(&mutexQueue);
pthread_cond_signal(&condQueue);
return 0;
}
В каждом треде процессинга:
// ----------------Begin Critical section --------------------
pthread_mutex_lock(&mutexQueue);
while (taskCount == 0 && !quit_signal) {
pthread_cond_wait(&condQueue, &mutexQueue);
}
if (!quit_signal) {
data = taskQueue[0];
for (register int i = 0; i < taskCount - 1; i++) {
taskQueue[i] = taskQueue[i + 1];
}
taskCount--;
} else {
pthread_mutex_unlock(&mutexQueue);
goto thread_exit;
}
pthread_mutex_unlock(&mutexQueue);
// ----------------End Critical section -----------------------
Работает как швейцарские часы (с).