Вы ищете файл с именем zImage
в нижней части списка.
Если я не ошибаюсь, это gzip
сжатый образ ядра, который загружает загрузчик.
Лучшая ссылка, которую я нашел при быстром поиске, это https://en.wikipedia.org/wiki/Vmlinux.
Если у кого-то есть лучшая ссылка, не стесняйтесь редактировать или комментировать.
Похоже, вам нужна рабочая очередь. Вы можете заполнить эту очередь коллекцией файлов, которые необходимо обработать, с функцией для удаления элемента из очереди, которая выполняет необходимую блокировку для предотвращения гонок между потоками. Затем начните сколько угодно потоков. Каждый поток удаляет элемент из очереди, обрабатывает его, а затем удаляет из очереди следующий элемент. Когда очередь становится пустой, поток может либо заблокироваться, ожидая ввода новых данных, либо, если известно, что ввода больше не будет, поток может завершиться.
Вот простой пример:
#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
ожидает завершения потоков перед возвратом.
Обратите внимание, что в этой схеме предполагается, что все элементы заполняются в очереди до запуска потоков. С некоторыми изменениями он может быть расширен для поддержки обработки новой работы во время выполнения потоков.