1) Я новичок в std :: thread, и я хотел бы знать, является ли хорошей практикой вызывать pthread_sigmask()
для блокировки некоторых сигналов в конкретном потоке, созданном std::thread
.
Я не хочу, чтобы новый поток получал такие сигналы, как SIGTERM, SIGHUP и т. Д., Поскольку основной процесс уже установил обработчики для этих сигналов.
Итак,Рекомендуется вызывать pthread_sigmask()
, чтобы заблокировать некоторые сигналы в потоке, созданном std::thread
?
2) Кроме того, я считаю, что эффект pthread_sigmask(SIG_BLOCK, &mask, NULL)
будет применяться только к потоку, созданному с использованием
std::thread(&Log::rotate_log, this, _logfile, _max_files, _compress).detach();
и вызов rotate_log()
в качестве функции запуска.
И эффект pthread_sigmask(SIG_BLOCK, &mask, NULL)
не будет применяться к потоку, где вызывается std::thread(&Log::rotate_log, this, _logfile, _max_files, _compress).detach()
.
Верно ли мое понимание?
void rotate_log (std::string logfile, uint32_t max_files, bool compress)
{
sigset_t mask;
sigemptyset (&mask);
sigaddset (&mask, SIGTERM);
sigaddset (&mask, SIGHUP);
pthread_sigmask(SIG_BLOCK, &mask, NULL);
// Do other stuff.
}
void Log::log (std::string message)
{
// Lock using mutex
std::lock_guard<std::mutex> lck(mtx);
_outputFile << message << std::endl;
_outputFile.flush();
_sequence_number++;
_curr_file_size = _outputFile.tellp();
if (_curr_file_size >= max_size) {
// Code to close the file stream, rename the file, and reopen
...
// Create an independent thread to compress the file since
// it takes some time to compress huge files.
if (!_log_compression_on)
{
std::thread(&Log::rotate_log, this, _logfile, _max_files, _compress).detach();
}
}
}