分离一个静态常量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()
{
...
}
或者:
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
*/
这是违法的吗?如何使用 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()
{
...
}
或者:
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
*/