LINUX.ORG.RU

История изменений

Исправление 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 -----------------------

Работает как швейцарские часы (с).