C++线程错误:"static_assert failed due to requirement"



我刚刚开始学习多线程编程,我正在尝试更改主函数中声明的变量。我的主要功能如下:

#include <iostream>
#include <thread>
void foo(int &args)
{
for (int i = 0; i < 10; i++)
{
args = rand() % 100;
}
}
int main()
{
int args;
std::thread worker(foo, args);
for (int i = 0; i < 10; i++)
{
std::cout << args << std::endl;
}
worker.join();
}

因此,我希望主函数所做的是将args作为引用,并更改位于该内存地址上的值。然而线程不喜欢这个想法。我从运行这段小代码中收到的实际消息是:

/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../include/c++/10.2.0/thread:135:2: error: static_assert failed due to requirement '__is_invocable<void (*)(int &), int>::value' "std::thread arguments must be invocable after conversion to rvalues"
static_assert( __is_invocable<typename decay<_Callable>::type,
^              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
multThread.cpp:15:17: note: in instantiation of function template specialization 'std::thread::thread<void (&)(int &), int &, void>' requested here
std::thread worker(foo, args);

再加上更多,但我发现用错误消息完全填满这篇帖子是多余的。我真的不确定是什么导致了这个问题,是线程只接受右值还是什么?提前感谢您的帮助。

要将引用参数传递给std::thread,需要在调用站点将其转换为reference_wrapper,如下所示:

std::thread worker(foo, std::ref(args));

这是因为std::thread复制其参数,而引用不能复制。

您使用std::ref:在std::reference_wrapper内部发送的参数最多

int args;
std::thread worker(foo, std::ref(args));

相关内容

  • 没有找到相关文章

最新更新