LINUX.ORG.RU

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

Исправление Tumyq, (текущая версия) :

похоже, я что-то намудрил.


#include "thread_pool/ctpl.h"

struct HFREntry_par {   
    std::string fname_in;
    std::string fname_out;
    unsigned int block_size;
};

    static fs::ifstream *f_in;
    static fs::ofstream *f_out;
    static ctpl::thread_pool *t_pool; 
    static std::mutex mtx, mtx2, mtx3;   

    static size_t f_size = 0, block_size = 0;   

void MT_HFReaderImpl::init_f(const HFREntry_par &vars)
{
    std::string path = vars.fname_in;
    if (!fs::exists(path) || !fs::is_regular_file(path)) return;
    block_size = vars.block_size;
    f_in = new fs::ifstream(path, std::ios::binary | std::ios::ate); //файл на чтение
    f_size = static_cast<size_t>(f_in->tellg()) + 1; //размер файла
    f_in->seekg(0);
    f_out = new fs::ofstream(vars.fname_out, std::ios::binary); //файл на запись
    int core_n = static_cast<int>(std::thread::hardware_concurrency()); //заряжаем пул
    t_pool = new ctpl::thread_pool(core_n);
}

void MT_HFReaderImpl::loop_f()
{
     //сколько целых блоков и остаток
    if ( f_size <= 0 || block_size <= 0 ) return;

    auto reader = [&]
    {
        if (f_in == nullptr || f_out == nullptr || t_pool == nullptr) return;

        std::string buffer(unsigned(block_size), '\0'); // Буфер
        std::hash<std::string> hash_fn;

        {
            // Начинаем чтение, другие треды ждут
            std::unique_lock<std::mutex> lock(mtx);

            // Читаем в буфер
            if (f_size < block_size){
                block_size = f_size;
            }

            f_in->read(&buffer[0],int(block_size));

            f_size -= block_size;
            if(f_size <= 0){
                finish();
            }
        }

        // Обрабатываем данные
        size_t _hash = hash_fn(buffer);

        {
            // Пишем в выходной файл, другие треды ждут
            std::unique_lock<std::mutex> lock(mtx2);

            *f_out << std::to_string(_hash) + "\n";

            std::cout << "hash:" << _hash << '\n';
        }
    };

    while (!f_in->eof()){
        t_pool->push([&] (int id) { reader(); });
    }
}

void MT_HFReaderImpl::finish()
{
    std::unique_lock<std::mutex> lock(mtx3);
    f_in->close();
    delete f_in;
    f_in = nullptr;
    f_out->close();
    delete f_out;
    f_out = nullptr;
    delete t_pool;
    t_pool = nullptr;
}

void MT_HFReaderImpl::file_read( const HFREntry_par & vars )
{
    init_f(vars);
    loop_f();
}

int main(int argc, char *argv[])
{
    HFREntry_par vars;

    vars.fname_in = "input_file_name.txt";
    vars.fname_out = "output_file_name.txt";
    vars.block_size = 1024 * 1024;

    file_read( vars );
}


Исправление Tumyq, :

похоже, я что-то намудрил.


#include "thread_pool/ctpl.h"

struct HFREntry_par {   
    std::string fname_in;
    std::string fname_out;
    unsigned int block_size;
};

    static fs::ifstream *f_in;
    static fs::ofstream *f_out;
    static ctpl::thread_pool *t_pool;    

    static size_t f_size = 0, block_size = 0;   

void MT_HFReaderImpl::init_f(const HFREntry_par &vars)
{
    std::string path = vars.fname_in;
    if (!fs::exists(path) || !fs::is_regular_file(path)) return;
    block_size = vars.block_size;
    f_in = new fs::ifstream(path, std::ios::binary | std::ios::ate); //файл на чтение
    f_size = static_cast<size_t>(f_in->tellg()) + 1; //размер файла
    f_in->seekg(0);
    f_out = new fs::ofstream(vars.fname_out, std::ios::binary); //файл на запись
    int core_n = static_cast<int>(std::thread::hardware_concurrency()); //заряжаем пул
    t_pool = new ctpl::thread_pool(core_n);
}

void MT_HFReaderImpl::loop_f()
{
     //сколько целых блоков и остаток
    if ( f_size <= 0 || block_size <= 0 ) return;

    auto reader = [&]
    {
        if (f_in == nullptr || f_out == nullptr || t_pool == nullptr) return;

        std::string buffer(unsigned(block_size), '\0'); // Буфер
        std::hash<std::string> hash_fn;

        {
            // Начинаем чтение, другие треды ждут
            std::unique_ptr<std::mutex> lock(new std::mutex);

            // Читаем в буфер
            if (f_size < block_size){
                block_size = f_size;
            }

            f_in->read(&buffer[0],int(block_size));

            f_size -= block_size;
            if(f_size <= 0){
                finish();
            }
        }

        // Обрабатываем данные
        size_t _hash = hash_fn(buffer);

        {
            // Пишем в выходной файл, другие треды ждут
            std::unique_ptr<std::mutex> lock(new std::mutex);

            *f_out << std::to_string(_hash) + "\n";

            std::cout << "hash:" << _hash << '\n';
        }
    };

    while (!f_in->eof()){
        t_pool->push([&] (int id) { reader(); });
    }
}

void MT_HFReaderImpl::finish()
{
    std::unique_ptr<std::mutex> lock(new std::mutex);
    f_in->close();
    delete f_in;
    f_in = nullptr;
    f_out->close();
    delete f_out;
    f_out = nullptr;
    delete t_pool;
    t_pool = nullptr;
}

void MT_HFReaderImpl::file_read( const HFREntry_par & vars )
{
    init_f(vars);
    loop_f();
}

int main(int argc, char *argv[])
{
    HFREntry_par vars;

    vars.fname_in = "input_file_name.txt";
    vars.fname_out = "output_file_name.txt";
    vars.block_size = 1024 * 1024;

    file_read( vars );
}


Исправление Tumyq, :

похоже, я что-то намудрил.


#include "thread_pool/ctpl.h"

struct HFREntry_par {   
    std::string fname_in;
    std::string fname_out;
    unsigned int block_size;
};

    static fs::ifstream *f_in;
    static fs::ofstream *f_out;
    static ctpl::thread_pool *t_pool;    

    static size_t f_size = 0, block_size = 0;   

void MT_HFReaderImpl::init_f(const HFREntry_par &vars)
{
    std::string path = vars.fname_in;
    if (!fs::exists(path) || !fs::is_regular_file(path)) return;
    block_size = vars.block_size;
    f_in = new fs::ifstream(path, std::ios::binary | std::ios::ate); //файл на чтение
    f_size = static_cast<size_t>(f_in->tellg()) + 1; //размер файла
    f_in->seekg(0);
    f_out = new fs::ofstream(vars.fname_out, std::ios::binary); //файл на запись
    int core_n = static_cast<int>(std::thread::hardware_concurrency()); //заряжаем пул
    t_pool = new ctpl::thread_pool(core_n);
}

void MT_HFReaderImpl::loop()
{
     //сколько целых блоков и остаток
    if ( f_size <= 0 || block_size <= 0 ) return;

    auto reader = [&]
    {
        if (f_in == nullptr || f_out == nullptr || t_pool == nullptr) return;

        std::string buffer(unsigned(block_size), '\0'); // Буфер
        std::hash<std::string> hash_fn;

        {
            // Начинаем чтение, другие треды ждут
            std::unique_ptr<std::mutex> lock(new std::mutex);

            // Читаем в буфер
            if (f_size < block_size){
                block_size = f_size;
            }

            f_in->read(&buffer[0],int(block_size));

            f_size -= block_size;
            if(f_size <= 0){
                finish();
            }
        }

        // Обрабатываем данные
        size_t _hash = hash_fn(buffer);

        {
            // Пишем в выходной файл, другие треды ждут
            std::unique_ptr<std::mutex> lock(new std::mutex);

            *f_out << std::to_string(_hash) + "\n";

            std::cout << "hash:" << _hash << '\n';
        }
    };

    while (!f_in->eof()){
        t_pool->push([&] (int id) { reader(); });
    }
}

void MT_HFReaderImpl::finish()
{
    std::unique_ptr<std::mutex> lock(new std::mutex);
    f_in->close();
    delete f_in;
    f_in = nullptr;
    f_out->close();
    delete f_out;
    f_out = nullptr;
    delete t_pool;
    t_pool = nullptr;
}

void MT_HFReaderImpl::file_read( const HFREntry_par & vars )
{
    init_f(vars);
    loop();
}

int main(int argc, char *argv[])
{
    HFREntry_par vars;

    vars.fname_in = "input_file_name.txt";
    vars.fname_out = "output_file_name.txt";
    vars.block_size = 1024 * 1024;

    file_read( vars );
}


Исправление Tumyq, :

похоже, я что-то намудрил.


#include "thread_pool/ctpl.h"

struct HFREntry_par {   
    std::string fname_in;
    std::string fname_out;
    unsigned int block_size;
};

    static fs::ifstream *f_in;
    static fs::ofstream *f_out;
    static ctpl::thread_pool *t_pool;    

    static size_t f_size = 0, block_size = 0;   

void MT_HFReaderImpl::init_f(const HFREntry_par &vars)
{
    std::string path = vars.fname_in;
    if (!fs::exists(path) || !fs::is_regular_file(path)) return;
    block_size = vars.block_size;
    f_in = new fs::ifstream(path, std::ios::binary | std::ios::ate); //файл на чтение
    f_size = static_cast<size_t>(f_in->tellg()) + 1; //размер файла
    f_in->seekg(0);
    f_out = new fs::ofstream(vars.fname_out, std::ios::binary); //файл на запись
    int core_n = static_cast<int>(std::thread::hardware_concurrency()); //заряжаем пул
    t_pool = new ctpl::thread_pool(core_n);
}

void MT_HFReaderImpl::loop()
{
     //сколько целых блоков и остаток
    if ( f_size <= 0 || block_size <= 0 ) return;

    auto reader = [&]
    {
        if (f_in == nullptr || f_out == nullptr || t_pool == nullptr) return;

        std::string buffer(unsigned(block_size), '\0'); // Буфер
        std::hash<std::string> hash_fn;

        {
            // Начинаем чтение, другие треды ждут
            std::unique_ptr<std::mutex> lock(new std::mutex);

            // Читаем в буфер
            if (f_size < block_size){
                block_size = f_size;
            }

            f_in->read(&buffer[0],int(block_size));

            f_size -= block_size;
            if(f_size <= 0){
                finish();
            }
        }

        // Обрабатываем данные
        size_t _hash = hash_fn(buffer);

        {
            // Пишем в выходной файл, другие треды ждут
            std::unique_ptr<std::mutex> lock(new std::mutex);

            *f_out << std::to_string(_hash) + "\n";

            std::cout << "hash:" << _hash << '\n';
        }
    };

    while (!f_in->eof()){
        t_pool->push([&] (int id) { reader(); });
    }
}

void MT_HFReaderImpl::finish()
{
    std::unique_ptr<std::mutex> lock(new std::mutex);
    f_in->close();
    delete f_in;
    f_in = nullptr;
    f_out->close();
    delete f_out;
    f_out = nullptr;
    delete t_pool;
    t_pool = nullptr;
}

void MT_HFReaderImpl::file_read( const HFREntry_par & vars )
{
    init_f(vars);
    loop();
}

int main(int argc, char *argv[])
{
    HFREntry_par vars;

    vars.fname_in = "input_file_name.txt";
    vars.fname_out = "output_file_name.txt";
    vars.block_size = 1024 * 1024;

    file_read( vars );


}


Исправление Tumyq, :

похоже, я что-то намудрил.


#include "thread_pool/ctpl.h"

struct HFREntry_par {   
    std::string fname_in;
    std::string fname_out;
    unsigned int block_size;
};

    static fs::ifstream *f_in;
    static fs::ofstream *f_out;
    static ctpl::thread_pool *t_pool;    

    static size_t f_size = 0, block_size = 0;   

void MT_HFReaderImpl::init_f(const HFREntry_par &vars)
{
    std::string path = vars.fname_in;
    if (!fs::exists(path) || !fs::is_regular_file(path)) return;
    block_size = vars.block_size;
    f_in = new fs::ifstream(path, std::ios::binary | std::ios::ate); //файл на чтение
    f_size = static_cast<size_t>(f_in->tellg()) + 1; //размер файла
    f_in->seekg(0);
    f_out = new fs::ofstream(vars.fname_out, std::ios::binary); //файл на запись
    int core_n = static_cast<int>(std::thread::hardware_concurrency()); //заряжаем пул
    t_pool = new ctpl::thread_pool(core_n);
}

void MT_HFReaderImpl::loop()
{
     //сколько целых блоков и остаток
    if ( f_size <= 0 || block_size <= 0 ) return;

    auto reader = [&]
    {
        if (f_in == nullptr || f_out == nullptr || t_pool == nullptr) return;

        std::string buffer(unsigned(block_size), '\0'); // Буфер
        std::hash<std::string> hash_fn;

        {
            // Начинаем чтение, другие треды ждут
            std::unique_ptr<std::mutex> lock(new std::mutex);

            // Читаем в буфер
            if (f_size < block_size){
                block_size = f_size;
            }

            f_in->read(&buffer[0],int(block_size));

            f_size -= block_size;
            if(f_size <= 0){
                finish();
            }
        }

        // Обрабатываем данные
        size_t _hash = hash_fn(buffer);

        {
            // Пишем в выходной файл, другие треды ждут
            std::unique_ptr<std::mutex> lock(new std::mutex);

            *f_out << std::to_string(_hash) + "\n";

            std::cout << "hash:" << _hash << '\n';
        }
    };

    while (!f_in->eof()){
        t_pool->push([&] (int id) { reader(); });
    }
}

void MT_HFReaderImpl::finish()
{
    std::unique_ptr<std::mutex> lock(new std::mutex);
    f_in->close();
    delete f_in;
    f_in = nullptr;
    f_out->close();
    delete f_out;
    f_out = nullptr;
    delete t_pool;
    t_pool = nullptr;
}

void MT_HFReaderImpl::file_read( const HFREntry_par & vars )
{
    init_f(vars);
    loop();
}

int main(int argc, char *argv[])
{
HFREntry_par vars;

 vars.fname_in = "input_file_name.txt";
    vars.fname_out = "output_file_name.txt";
    vars.block_size = 1024 * 1024;

file_read( vars );


}


Исправление Tumyq, :

похоже, я что-то намудрил.


#include "thread_pool/ctpl.h"

struct HFREntry_par {   
    std::string fname_in;
    std::string fname_out;
    unsigned int block_size;
};

    static fs::ifstream *f_in;
    static fs::ofstream *f_out;
    static ctpl::thread_pool *t_pool;    

    static size_t f_size = 0, block_size = 0;
    static atomic<size_t> bl_cnt { 0 };

void MT_HFReaderImpl::init_f(const HFREntry_par &vars)
{
    std::string path = vars.fname_in;
    if (!fs::exists(path) || !fs::is_regular_file(path)) return;
    block_size = vars.block_size;
    f_in = new fs::ifstream(path, std::ios::binary | std::ios::ate); //файл на чтение
    f_size = static_cast<size_t>(f_in->tellg()) + 1; //размер файла
    f_in->seekg(0);
    f_out = new fs::ofstream(vars.fname_out, std::ios::binary); //файл на запись
    int core_n = static_cast<int>(std::thread::hardware_concurrency()); //заряжаем пул
    t_pool = new ctpl::thread_pool(core_n);
}

void MT_HFReaderImpl::loop()
{
     //сколько целых блоков и остаток
    if ( f_size <= 0 || block_size <= 0 ) return;

    auto reader = [&]
    {
        if (f_in == nullptr || f_out == nullptr || t_pool == nullptr) return;

        std::string buffer(unsigned(block_size), '\0'); // Буфер
        std::hash<std::string> hash_fn;

        {
            // Начинаем чтение, другие треды ждут
            std::unique_ptr<std::mutex> lock(new std::mutex);

            // Читаем в буфер
            if (f_size < block_size){
                block_size = f_size;
            }

            f_in->read(&buffer[0],int(block_size));

            f_size -= block_size;
            if(f_size <= 0){
                finish();
            }
        }

        // Обрабатываем данные
        size_t _hash = hash_fn(buffer);

        {
            // Пишем в выходной файл, другие треды ждут
            std::unique_ptr<std::mutex> lock(new std::mutex);

            *f_out << std::to_string(_hash) + "\n";

            std::cout << "hash:" << _hash << '\n';
        }
    };

    while (!f_in->eof()){
        t_pool->push([&] (int id) { reader(); });
    }
}

void MT_HFReaderImpl::finish()
{
    std::unique_ptr<std::mutex> lock(new std::mutex);
    f_in->close();
    delete f_in;
    f_in = nullptr;
    f_out->close();
    delete f_out;
    f_out = nullptr;
    delete t_pool;
    t_pool = nullptr;
}

void MT_HFReaderImpl::file_read( const HFREntry_par & vars )
{
    init_f(vars);
    loop();
}

int main(int argc, char *argv[])
{
HFREntry_par vars;

 vars.fname_in = "input_file_name.txt";
    vars.fname_out = "output_file_name.txt";
    vars.block_size = 1024 * 1024;

file_read( vars );


}


Исходная версия Tumyq, :

похоже, я что-то намудрил.


#include "thread_pool/ctpl.h"

struct HFREntry_par {   
    std::string fname_in;
    std::string fname_out;
    unsigned int block_size;
};

    static fs::ifstream *f_in;
    static fs::ofstream *f_out;
    static ctpl::thread_pool *t_pool;
    static std::mutex mtx, mtx2, mtx3;

    static size_t f_size = 0, block_size = 0;
    static atomic<size_t> bl_cnt { 0 };

void MT_HFReaderImpl::init_f(const HFREntry_par &vars)
{
    std::string path = vars.fname_in;
    if (!fs::exists(path) || !fs::is_regular_file(path)) return;
    block_size = vars.block_size;
    f_in = new fs::ifstream(path, std::ios::binary | std::ios::ate); //файл на чтение
    f_size = static_cast<size_t>(f_in->tellg()) + 1; //размер файла
    f_in->seekg(0);
    f_out = new fs::ofstream(vars.fname_out, std::ios::binary); //файл на запись
    int core_n = static_cast<int>(std::thread::hardware_concurrency()); //заряжаем пул
    t_pool = new ctpl::thread_pool(core_n);
}

void MT_HFReaderImpl::loop()
{
     //сколько целых блоков и остаток
    if ( f_size <= 0 || block_size <= 0 ) return;

    auto reader = [&]
    {
        if (f_in == nullptr || f_out == nullptr || t_pool == nullptr) return;

        std::string buffer(unsigned(block_size), '\0'); // Буфер
        std::hash<std::string> hash_fn;

        {
            // Начинаем чтение, другие треды ждут
            std::unique_ptr<std::mutex> lock(new std::mutex);

            // Читаем в буфер
            if (f_size < block_size){
                block_size = f_size;
            }

            f_in->read(&buffer[0],int(block_size));

            f_size -= block_size;
            if(f_size <= 0){
                finish();
            }
        }

        // Обрабатываем данные
        size_t _hash = hash_fn(buffer);

        {
            // Пишем в выходной файл, другие треды ждут
            std::unique_ptr<std::mutex> lock(new std::mutex);

            *f_out << std::to_string(_hash) + "\n";

            std::cout << "hash:" << _hash << '\n';
        }
    };

    while (!f_in->eof()){
        t_pool->push([&] (int id) { reader(); });
    }
}

void MT_HFReaderImpl::finish()
{
    std::unique_ptr<std::mutex> lock(new std::mutex);
    f_in->close();
    delete f_in;
    f_in = nullptr;
    f_out->close();
    delete f_out;
    f_out = nullptr;
    delete t_pool;
    t_pool = nullptr;
}

void MT_HFReaderImpl::file_read( const HFREntry_par & vars )
{
    init_f(vars);
    loop();
}

int main(int argc, char *argv[])
{
HFREntry_par vars;

 vars.fname_in = "input_file_name.txt";
    vars.fname_out = "output_file_name.txt";
    vars.block_size = 1024 * 1024;

file_read( vars );


}