c++ - 为什么这些静态函数不按预期从另一个线程返回?
问题描述
我正在尝试使用多个线程使一个函数与另一个函数同时运行,但是当新线程正在运行的函数使用静态函数时,由于某种原因它总是返回 0。
我在 Linux 上将 Boost 用于线程,静态函数在不使用线程时完全按预期工作。我很确定这不是数据竞争问题,因为如果我在创建线程后直接加入线程(不给任何其他代码更改任何内容的机会),问题仍然存在。
创建线程的函数:
void WorldIOManager::createWorld(unsigned int seed, std::string worldName, bool isFlat) {
boost::thread t( [=]() { P_createWorld(seed, worldName, isFlat); } );
t.join();
//P_createWorld(seed, worldName, isFlat); // This works perfectly fine
}
P_createWorld 中使用静态函数的部分(新创建的线程实际运行的函数):
m_world->chunks[i]->tiles[y][x] = createBlock(chunkData[i].tiles[y][x].id, chunkData[i].tiles[y][x].pos, m_world->chunks[i]);
m_world 是一个结构,它包含一个 Chunks 数组,其中包含一个二维 Tiles 数组,每个 Tiles 都有与缓存中的纹理相关联的纹理 ID。createBlock 返回一个指向完全初始化的新切片指针的指针。有问题的静态函数属于静态链接库,定义如下:
namespace GLEngine {
//This is a way for us to access all our resources, such as
//Models or textures.
class ResourceManager
{
public:
static GLTexture getTexture(std::string texturePath);
private:
static TextureCache _textureCache;
};
}
此外,它的实现:
#include "ResourceManager.h"
namespace GLEngine {
TextureCache ResourceManager::_textureCache;
GLTexture ResourceManager::getTexture(std::string texturePath) {
return _textureCache.getTexture(texturePath);
}
}
预期结果:为每个图块实际分配其正确的纹理 ID
实际结果:每个图块,无论纹理路径如何,都被指定为 0 作为其纹理 ID。
如果您需要更多代码,例如 tile 的构造函数或 createBlock(),我会很乐意添加它,我只是不知道在这种情况下哪些信息是相关的......
所以,正如我之前所说,如果我没有线程,所有这些都可以完美运行,所以我的最后一个问题是:是否存在某种未定义的行为与线程调用的静态函数有关,或者我只是在这里做错了什么?
解决方案
正如@fifoforlifo 提到的,OpenGL 上下文具有线程亲和性,事实证明我在我的纹理加载函数中进行了更深入的 GL 调用。我创建了第二个 GL 上下文并打开了上下文共享,然后它开始工作。非常感谢,@fifoforlifo!
推荐阅读
- flutter - 获取数据时颤动无效参数
- php - 当你得到它们并继续请求更多时,从 http 请求中回显数据
- azure - 通过 Azure ARM Rest API 创建机器人连接
- django - 用于点数组的 Django 小部件
- azure - 使用 powershell、cmd 或 python 自动创建 M365 Outlook 配置文件
- javascript - 无法在博览会中启动背景任务
- typescript - 方法重载在 Typecsript 上不起作用
- android - 如何在自定义视图中设置动画位置以进行 xml 预览
- javascript - momentjs 中的时间表示无效
- python - 当从计时器模块使用 default_timer 时,“输出时间单位”是什么?