代码之家  ›  专栏  ›  技术社区  ›  Cobra_Fast

应用程序后台时线程被终止?

  •  3
  • Cobra_Fast  · 技术社区  · 7 年前

    我正在开发一个fuse文件系统,在调用之前 fuse_main_real() std::thread 在一个类实例中做一些后台工作。

    this->t_receive = new std::thread([this] { this->receive(); });
    

    然而,似乎 fuse\u main\u 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”):

    ./test.o -f /home/test/testmountpoint
    

    命令不起作用并显示问题(说“测试”一次):

    ./test.o /home/test/testmountpoint
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   log0    7 年前

    这个 libfuse wiki

    其他线程应该从init()方法开始。当进程进入后台时,在fuse_main()之前启动的线程将退出。