繁体   English   中英

分离 static const 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 object 上调用detach() ,因为detach()需要修改std::thread的 state 。

在这种情况下,我建议根本不要使用 static std::thread object。 特别是因为它是一次性使用的线程,所以一旦线程开始运行, std::thread object 就不需要挂起。 在另一个 function 或 static 方法中使用本地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()
{
    ...
}

现场演示

或者:

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
*/

现场演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM