线程新手:在线程参数中使用std::ref()时出现问题 我是C++线程的新手,尝试让几个对象打包在 STD::vector < /Calp>异步调用他们的代码>准备好渲染(…)< />代码。看来我用错了std::ref。这项工作: for (ObjMesh& mesh : this->meshes) { // Prepare mesh std::thread t(&ObjMesh::prepareForRendering, mesh, pDevice, prepareTextures, prepareVertices, prepareBuffers, filter, addressMode); t.join(); }

线程新手:在线程参数中使用std::ref()时出现问题 我是C++线程的新手,尝试让几个对象打包在 STD::vector < /Calp>异步调用他们的代码>准备好渲染(…)< />代码。看来我用错了std::ref。这项工作: for (ObjMesh& mesh : this->meshes) { // Prepare mesh std::thread t(&ObjMesh::prepareForRendering, mesh, pDevice, prepareTextures, prepareVertices, prepareBuffers, filter, addressMode); t.join(); },c++,multithreading,c++11,pass-by-reference,C++,Multithreading,C++11,Pass By Reference,这并不是: for (ObjMesh& mesh : this->meshes) { // Prepare mesh std::thread t(&ObjMesh::prepareForRendering, std::ref(mesh), pDevice, prepareTextures, prepareVertices, prepareBuffers, filter, addressMode); t.join(); } 编译器抛出: 1>

这并不是:

for (ObjMesh& mesh : this->meshes) {

    // Prepare mesh
    std::thread t(&ObjMesh::prepareForRendering, std::ref(mesh), pDevice, prepareTextures, prepareVertices, prepareBuffers, filter, addressMode);
    t.join();
}
编译器抛出:

1>c:\program files (x86)\microsoft visual studio 14.0\vc\include\thr\xthread(238): error C2893: Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...)'
1>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\thr\xthread(238): note: With the following template arguments:
1>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\thr\xthread(238): note: '_Callable=bool (__thiscall ObjMesh::* )(ID3D11Device *,bool,bool,bool,D3D11_FILTER,D3D11_TEXTURE_ADDRESS_MODE)'
1>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\thr\xthread(238): note: '_Types={std::reference_wrapper<ObjMesh>, ID3D11Device *, bool, bool, bool, D3D11_FILTER, D3D11_TEXTURE_ADDRESS_MODE}'
1>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\thr\xthread(247): note: see reference to function template instantiation 'void std::_LaunchPad<_Target>::_Execute<0,1,2,3,4,5,6,7>(std::tuple<bool (__thiscall ObjMesh::* )(ID3D11Device *,bool,bool,bool,D3D11_FILTER,D3D11_TEXTURE_ADDRESS_MODE),std::reference_wrapper<ObjMesh>,ID3D11Device *,bool,bool,bool,D3D11_FILTER,D3D11_TEXTURE_ADDRESS_MODE> &,std::integer_sequence<_Ty,0,1,2,3,4,5,6,7>)' being compiled
1>          with
1>          [
1>              _Target=std::unique_ptr<std::tuple<bool (__thiscall ObjMesh::* )(ID3D11Device *,bool,bool,bool,D3D11_FILTER,D3D11_TEXTURE_ADDRESS_MODE),std::reference_wrapper<ObjMesh>,ID3D11Device *,bool,bool,bool,D3D11_FILTER,D3D11_TEXTURE_ADDRESS_MODE>,std::default_delete<std::tuple<bool (__thiscall ObjMesh::* )(ID3D11Device *,bool,bool,bool,D3D11_FILTER,D3D11_TEXTURE_ADDRESS_MODE),std::reference_wrapper<ObjMesh>,ID3D11Device *,bool,bool,bool,D3D11_FILTER,D3D11_TEXTURE_ADDRESS_MODE>>>,
1>              _Ty=size_t
1>          ]

只需将指针传递到绑定:

std::thread t(&ObjMesh::prepareForRendering, &mesh, pDevice, prepareTextures, prepareVertices, prepareBuffers, filter, addressMode);

为什么要将
std::ref
用于
mesh
,因为它已经是一个参考?第一个代码所做的是(本质上)
mesh.prepareForRendering(pDevice,…)
,返回的包装器不支持该语义。
mesh.prepareForRendering(pDevice,…)
在第一个代码片段中,对
mesh
的副本进行操作。我的问题是:我需要
mesh
作为线程内的引用传递。这是可能的吗?或者我完全错了,问题是其他的吗?您需要提供
prepareforending
的签名。我认为问题可能是因为PrepreForRendering函数在其线程本地创建了DX11缓冲区,并且在尝试从主线程读取时给了我读取访问冲突线这有意义吗?我有,但我的问题似乎在别处。解决了我的问题。
std::thread t(&ObjMesh::prepareForRendering, &mesh, pDevice, prepareTextures, prepareVertices, prepareBuffers, filter, addressMode);