gpt4 book ai didi

c++ - 在函数周围调用std::thread()的工作方式不同

转载 作者:行者123 更新时间:2023-12-03 13:16:31 26 4
gpt4 key购买 nike

是否有任何原因导致此代码在这里:

int main(int argc, char* argv[])
{

Main::Init();
std::thread worker(Main::Mainloop);
worker.join();
Main::Free();

return 0;
}
在这里应与此代码不同地工作:
int main(int argc, char* argv[])
{

Main::Init();
Main::Mainloop();
Main::Free();

return 0;
}
注意到 Main类被定义为单例,下面是代码:
main.h
#pragma once

#ifndef MAIN_H
#define MAIN_H


#include "window.h"


#include "mainloop.h"




class Main ///Singleton
{
public:
Main(const Main&) = delete;
Main(Main&&) = delete;
Main& operator=(const Main&) = delete;
Main& operator=(Main&&) = delete;



private:
Main();


static Main& Get_Instance();


friend int main(int argc, char* argv[]);


static void Mainloop();
static void Init();
static void Free();


};



#endif // MAIN_H
上面的第一个示例未能初始化 GLFW, GLEW, and ImGui之一,这是我在程序中使用的代码。我试图拆分程序的初始化,但是后来遇到了这个问题。当我进一步挖掘时,我到达了这一点,为什么它不起作用并没有任何意义。基本上,它要么抛出异常,要么ImGui在运行时向我发送很多错误的垃圾邮件,说:
failed to compile vertex shader!
failed to compile fragment shader!
failed to link shader program! (with GLSL `#version 460`)
但是窗口打开了,我只能在运行时通过线程示例获取这些信息。不与另一个。

最佳答案

所有这些库都以某种方式与OpenGL交互,因此对它们在哪个线程上执行非常敏感。当前的OpenGL上下文是特定于线程的;每个线程都有自己的当前上下文,并且上下文在任何时候都只能是一个线程中的当前上下文。
创建GLFW窗口将创建OpenGL上下文。如果随后切换到另一个线程,则除非您告诉GLFW在该线程中将其设为当前状态,否则该上下文将不是该线程中的当前上下文。

关于c++ - 在函数周围调用std::thread()的工作方式不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66702171/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com