Я разрабатываю файловую систему fuse и перед вызовом fuse_main_real()
Я начинаю std::thread
в экземпляре класса, чтобы сделать некоторую фоновую работу.
this->t_receive = new std::thread([this] { this->receive(); });
Тем не менее, похоже, fuse_main_real()
убивает эту тему при переходе в фоновый режим.
Если я начну программу с -f
Опция, которая указывает fuse оставаться на переднем плане, проблема не возникает и поток выживает.
Я не уверен, что предохранитель делает в фоновом режиме.
Как мне сделать так, чтобы моя нить выживала в фоновом режиме?
Изменить: Вот базовый пример, который раскрывает проблему:
#define FUSE_USE_VERSION 30
#include <iostream>
#include <thread>
#include <fuse.h>
static void thread_method()
{
while (true)
{
std::cout << "test" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
struct testop : fuse_operations
{ };
static struct testop ops;
int main(int argc, char** argv)
{
std::thread(thread_method).detach();
fuse_main_real(argc, argv, &ops, sizeof(fuse_operations), NULL);
}
Компилировать с
g++ -D_FILE_OFFSET_BITS=64 `pkg-config --cflags fuse` -lfuse -lpthread -std=c++14 -o test.o test.cpp
Команда, которая работает (неоднократно говорит «тест»):
./test.o -f /home/test/testmountpoint
Команда, которая не работает и показывает проблему (однажды говорит «test»):
./test.o /home/test/testmountpoint
libfuse wiki Говорит, что
Разные потоки следует запускать из метода init (). Потоки, запущенные до того, как fuse_main () завершится, когда процесс перейдет в фоновый режим.
Других решений пока нет …