gpt4 book ai didi

c++ - 我们可以为boost库中的每个线程创建单独的日志文件吗

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:47:44 25 4
gpt4 key购买 nike

我想知道我们是否可以通过执行某些函数或使用 add_file_log 函数为每个线程创建单独的日志文件。

以下程序根据创建的线程数创建日志文件数。但是我们正在执行相同次数的相同代码集。对于大量线程,这可能会导致应用程序变慢。

#include <iostream>
#include <boost/move/utility.hpp>
#include <boost/log/sources/logger.hpp>
#include <boost/log/sources/record_ostream.hpp>
#include <boost/log/sources/global_logger_storage.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <cstring>
#include <stdlib.h>
#include <boost/thread.hpp>
#include <boost/date_time.hpp>
namespace logging = boost::log;
namespace src = boost::log::sources;
namespace keywords = boost::log::keywords;
int count = 0;
class class_logging {
public:
void logging_function() {
char filename[15] = "sample";
char extension[5] = ".log";
int c = count++;
char num[10];
std::sprintf(num, "%d", c);
std::strcat(filename, num);
std::strcat(filename, extension);
logging::add_file_log(filename);
logging::add_common_attributes();
src::logger lg;
logging::record rec = lg.open_record();
if (rec) {
logging::record_ostream strm(rec);
strm << "Count Value :" << c;
strm.flush();
lg.push_record(boost::move(rec));
}
}
};
int main(int, char* []) {
class_logging object[100];
int total;
std::cout << "\nEnter no. of threads to produce : ";
std::cin >> total;
for (int i = 0; i < total; i++) {
boost::thread thread1(&class_logging::logging_function, &object[i]);
std::cout << "\nThread " << i
<< " is created whose id is : " << thread1.get_id();
thread1.join();
std::cout << "\nThread " << i << " is done...";
thread1.detach();
}
return 0;
}

Q-1) 有什么方法可以动态创建日志文件吗?

最佳答案

本质上,考虑到正在执行的单个(此处为线程)任务,将日志写入单独的文件并没有错。如果量太大,减少日志记录比减少日志文件数更有帮助。

另一种策略是将线程专用于日志记录。然后将所有日志消息发送到该线程/任务进行处理。它可以使用生产者/消费者模式来实现。

在日志记录中添加时间戳也是一个好主意。它将有助于解决您可能需要处理的任何排序问题或日志。


看起来您在 count 上有一个竞争条件,在这行代码中:int c = count++; 增量不是原子的。

我会在线程创建时将“计数”传递给线程,或者将 count 变量修改为原子变量(使用 std::atomic types 之一)。

std::atomic<int> count = 0;

关于c++ - 我们可以为boost库中的每个线程创建单独的日志文件吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35147299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com