Планирование заданий из очереди на несколько потоков

Вы ищете файл с именем zImageв нижней части списка.

Если я не ошибаюсь, это gzipсжатый образ ядра, который загружает загрузчик.

Лучшая ссылка, которую я нашел при быстром поиске, это https://en.wikipedia.org/wiki/Vmlinux.

Если у кого-то есть лучшая ссылка, не стесняйтесь редактировать или комментировать.

0
16.09.2020, 16:08
1 ответ

Похоже, вам нужна рабочая очередь. Вы можете заполнить эту очередь коллекцией файлов, которые необходимо обработать, с функцией для удаления элемента из очереди, которая выполняет необходимую блокировку для предотвращения гонок между потоками. Затем начните сколько угодно потоков. Каждый поток удаляет элемент из очереди, обрабатывает его, а затем удаляет из очереди следующий элемент. Когда очередь становится пустой, поток может либо заблокироваться, ожидая ввода новых данных, либо, если известно, что ввода больше не будет, поток может завершиться.

Вот простой пример:

#include <cstdio>
#include <mutex>
#include <queue>
#include <thread>

template<typename T>
class ThreadSafeQueue {
public:
    void enqueue(const T& element)
    {
        std::lock_guard<std::mutex> lock(m_mutex);

        m_queue.push(element);
    }

    bool dequeue(T& value)
    {
        std::lock_guard<std::mutex> lock(m_mutex);

        if (m_queue.empty()) {
            return false;
        }

        value = m_queue.front();
        m_queue.pop();

        return true;
    }

private:
    std::mutex m_mutex;
    std::queue<T> m_queue;
};

static void threadEntry(const int threadNumber, ThreadSafeQueue<std::string>* const queue)
{
    std::string filename;

    while (queue->dequeue(filename)) {
        printf("Thread %d processing file '%s'\n", threadNumber, filename.c_str());
    }
}

int main()
{
    ThreadSafeQueue<std::string> queue;

    // Populate queue
    for (int i = 0; i < 100000; ++i) {
        queue.enqueue("filename_" + std::to_string(i) + ".txt");
    }

    const size_t NUM_THREADS = 4;

    // Spin up some threads
    std::thread threads[NUM_THREADS];
    for (int i = 0; i < NUM_THREADS; ++i) {
        threads[i] = std::thread(threadEntry, i, &queue);
    }

    // Wait for threads to finish
    for (int i = 0; i < NUM_THREADS; ++i) {
        threads[i].join();
    }

    return 0;
}

Компилировать с помощью:

$ g++ example.cpp -pthread

Программа определяетThreadSafeQueue--очередь с внутренней блокировкой, чтобы обеспечить одновременный доступ к ней нескольких потоков.

Функция mainначинается с заполнения очереди. Затем он запускает 4 потока. Каждый поток считывает значение из очереди и "обрабатывает" его (здесь, выводя сообщение на стандартный вывод ). Когда очередь пуста, потоки завершаются. Функция mainожидает завершения потоков перед возвратом.

Обратите внимание, что в этой схеме предполагается, что все элементы заполняются в очереди до запуска потоков. С некоторыми изменениями он может быть расширен для поддержки обработки новой работы во время выполнения потоков.

1
18.03.2021, 23:04

Теги

Похожие вопросы