c++ std::execution::par in for_each and write files

发布时间 2023-06-29 11:32:50作者: Fred1987
#include <algorithm>
#include <chrono>
#include <cstdint>
#include <execution>
#include <fstream>
#include <future>
#include <iomanip>
#include <iostream>
#include <random>
#include <sstream>
#include <thread>
#include <uuid/uuid.h>
#include <vector>

char *uuid_value = (char *)malloc(40);
char *get_uuid_value()
{
    uuid_t new_uuid;
    uuid_generate(new_uuid);
    uuid_unparse(new_uuid, uuid_value);
    return uuid_value;
}

std::string get_time_now()
{
    std::chrono::time_point<std::chrono::high_resolution_clock> now = std::chrono::high_resolution_clock::now();
    time_t raw_time = std::chrono::high_resolution_clock::to_time_t(now);
    struct tm tm_info = *localtime(&raw_time);
    auto seconds = std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch());
    auto mills = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
    auto micros = std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch());
    auto nanos = std::chrono::duration_cast<std::chrono::nanoseconds>(now.time_since_epoch());

    std::stringstream ss;
    ss << std::put_time(&tm_info, "%Y%m%d%H%M%S") << "_"
       << std::setw(3) << std::setfill('0') << (mills.count() - seconds.count() * 1000)
       << std::setw(3) << std::setfill('0') << (micros.count() - mills.count() * 1000)
       << std::setw(3) << std::setfill('0') << (nanos.count() - micros.count() * 1000);
    return ss.str();
}

std::random_device rd;
std::mt19937_64 mt{rd()};

template <typename T>
T gen_random(T min, T max)
{
    std::uniform_int_distribution<T> uid(min, max);
    return uid(mt);
}

void log_file_par(const std::string &file_name, const int loops)
{
    std::fstream w_file(file_name, std::ios::app);
    if (!w_file.is_open())
    {
        std::cout << get_time_now() << ",create or open " << file_name << " failed!" << std::endl;
        return;
    }
    static int par_loops = 0;
    static std::uint64_t num = 0;
    std::stringstream ss;
    std::vector<int> vec;
    for (int i = 1; i < loops + 1; i++)
    {
        vec.push_back(i);
    }

    std::for_each(std::execution::par, vec.begin(), vec.end(), [&ss, &w_file](int x)
        { 
            std::uint64_t start_num = (x - 1) * 1000000;
            std::cout<<get_time_now()<<",start_num:"<<start_num<<",in "<<__LINE__<<std::endl;
            for (int i = 1; i < 1000001; i++)
            {
                ss << ++start_num << "," << get_uuid_value() << std::endl;
                ++num;
            }
            w_file << ss.str();
            ss = std::stringstream();
            if (!w_file.good())
            {
                std::cout << get_time_now() << ",num:" << num << ",start_num:" << start_num << ",write failed!" << std::endl;
                w_file.close();
                return;
            }
            std::cout << get_time_now() << ",num:" << num << ",start_num:" << start_num << std::endl; 
        });

    w_file.close();
    std::cout << get_time_now() << ",num:" << num << ",finished in:" << __FUNCTION__ << std::endl;
}

int main(int args, char **argv)
{
    log_file_par(argv[1], atoi(argv[2]));
    std::cout<<get_time_now()<<",id:"<<std::this_thread::get_id()<<",in "<<__FUNCTION__<<std::endl;
}

 

g++-12 -std=c++2a -I. *.cpp -o h1 -luuid

nohup ./h1 log.txt 100000 >> write.log |tail -f write.log