分离一个静态常量std::thread?

Detach a static const std::thread?

这是违法的吗?如何使用 private 隐藏这个全局线程实例?它似乎在没有 const 的情况下也能工作,但我仍然想 const 只是为了安心。

struct AbstractImage {
private:
    static void LoadImages();
    static const std::thread ImageLoader;
};
...
const std::thread AbstractImage::ImageLoader( AbstractImage::LoadImages );

void AbstractImage::LoadImages() {
    ImageLoader.detach();
}
'void std::thread::detach(void)': cannot convert 'this' pointer from 'const std::thread' to 'std::thread &'

您不能在 const std::thread 对象上调用 detach(),因为 detach() 需要修改 std::thread 的状态。

在这种情况下,我建议根本不要使用静态 std::thread 对象。特别是因为它是一个一次性线程,所以 std::thread 对象不需要在线程启动后挂起 运行。在另一个函数或静态方法中使用局部 std::thread 变量,然后您可以根据需要在启动时调用它,例如:

struct AbstractImage
{
private:
    static void LoadImages();

    struct LoadImagesStarter
    {
        LoadImagesStarter()
        {
            std::thread(AbstractImage::LoadImages).detach();
        }
    };

    static const LoadImagesStarter ImageLoader;
};
...

const AbstractImage::LoadImagesStarter AbstractImage::ImageLoader;

void AbstractImage::LoadImages()
{
    ...
}

Live Demo

或者:

struct AbstractImage
{
private:
    static void LoadImages();

    friend void LoadImagesStarter();
};
//...

void AbstractImage::LoadImages()
{
    ...
}

__attribute__((constructor)) void LoadImagesStarter()
{
    std::thread(AbstractImage::LoadImages).detach();
}

/* or, if your compiler supports this:
void LoadImagesStarter()
{
    std::thread(AbstractImage::LoadImages).detach();
}
#pragma startup LoadImagesStarter 100
*/

Live Demo