为什么这些静态函数没有按预期从另一个线程返回?

Why don't these static functions return as expected from another thread?

本文关键字:另一个 线程 返回 静态函数 为什么      更新时间:2023-10-16

>我正在尝试使用多个线程使一个函数与另一个函数同时运行,但是当新线程正在运行的函数使用静态函数时,由于某种原因,它总是返回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 是一个结构,其中包含一个块数组,该数组具有一个二维的图块数组,每个图块都有与缓存中的纹理关联的纹理 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。

如果您需要更多代码,例如磁贴或createBlock()的构造函数,我很乐意添加它,我只是真的不知道在这种情况下哪些信息是相关的......

所以,正如我之前所说,如果我没有线程,所有这些都可以完美地工作,所以我的最后一个问题是:是否存在某种未定义的行为与线程调用的静态函数有关,或者我只是在这里做错了什么?

正如@fifoforlifo提到的,OpenGL 上下文具有线程亲和性,事实证明,我正在更深入地进行纹理加载函数中的 GL 调用。我创建了第二个 GL 上下文并打开了上下文共享,然后它开始工作。非常感谢,@fifoforlifo!