为什么这些静态函数没有按预期从另一个线程返回?
Why don't these static functions return as expected from another thread?
>我正在尝试使用多个线程使一个函数与另一个函数同时运行,但是当新线程正在运行的函数使用静态函数时,由于某种原因,它总是返回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!
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在另一个线程中调用luaL_error会引发qWarning
- 最佳做法是从另一个线程访问 qml 中的Q_PROPERTY
- C++线程:如何在一个线程仍在运行时阻止另一个线程执行 (Win32)
- 结束另一个线程中使用的对象的生存期
- 从不同进程中的另一个线程挂起/恢复线程或进程
- 两个线程一个使用流 Api,另一个线程创建文件失败并出现错误ERROR_SHARING_VIOLATION
- 计时器是否从另一个线程启动?
- 互斥,Windows 10,c ++,在一个线程上获取,在另一个线程上发布
- Qt 在另一个线程中无限循环
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 从另一个线程发出信号是否安全?
- AMQP-CPP,libev >停止ev_loop来自另一个线程
- 在没有任何锁的情况下加入另一个线程后是否需要内存围栏?
- ::grpc::ServerReaderWriter 对象在另一个线程中一段时间后无法调用
- 如何在 qt 中从另一个线程运行 qt并发时关闭程序
- C++将互斥锁锁定为来自另一个线程
- QTcpSocket:消息不是从另一个线程发送的
- 如何从另一个线程调用颤振引擎方法
- 在另一个线程上发出 QObject 信号的正确方法?