无法在 std::thread 中传递一维数组
Can not pass 1D array in std::thread
这是我的实际项目,但我做了一个最小的例子(代码基于 Lightness Races in Orbit 的例子)。
#include <thread>
#include <iostream>
class Foo
{
Foo(int n = 10)
{
size_t a[n];
constexpr int p = 5;
std::thread threads[p];
for (int i = 0; i < p; ++i)
threads[i] = std::thread(std::bind(&Foo::bar, this, a, n));
for (auto& th : threads) th.join();
}
void bar(size_t* a, int n) {}
};
int main() {std::cout << "ok\n";}
错误是因为我使用的数组大小为 n
。但是,在实际项目中,我很难改变它,因为很多代码行都是基于它的。
使用向量
或者在类型推导发生之前通过将数组衰减为指针来解决问题:
std::bind(&Foo::bar, this, +a, n)
问题是,绑定正在推导数组引用,然后尝试/按值/复制它。语言未指定数组副本。
这是我的实际项目,但我做了一个最小的例子(代码基于 Lightness Races in Orbit 的例子)。
#include <thread>
#include <iostream>
class Foo
{
Foo(int n = 10)
{
size_t a[n];
constexpr int p = 5;
std::thread threads[p];
for (int i = 0; i < p; ++i)
threads[i] = std::thread(std::bind(&Foo::bar, this, a, n));
for (auto& th : threads) th.join();
}
void bar(size_t* a, int n) {}
};
int main() {std::cout << "ok\n";}
错误是因为我使用的数组大小为 n
。但是,在实际项目中,我很难改变它,因为很多代码行都是基于它的。
使用向量
或者在类型推导发生之前通过将数组衰减为指针来解决问题:
std::bind(&Foo::bar, this, +a, n)
问题是,绑定正在推导数组引用,然后尝试/按值/复制它。语言未指定数组副本。