参考 std::thread 参数
Reference at std::thread parameters
我有两个功能
void f(const int &x) {}
void g(int& x) {}
我可以
int x = 0;
std::thread t1(f, x);
但我无法创建 std::thread t2(g, x)
,在这种情况下我需要创建 std::ref(x)
而不是 x
,为什么有必要?
以及为什么可以在没有 std::cref
的情况下创建 t1
?
如果没有 std::cref()
,您的 f()
功能将无法正常工作。
虽然f()
无意改变x
后面的值,但这并不意味着这个引用后面的值不能在别处改变。
在这个例子中,没有std::cref()
原始int
的副本被放入线程堆栈,x
引用这个副本;我们看到 1
和 1
.
另一方面,对于std::cref()
,x
仍然引用原作;我们看到 1
和 2
.
/**
g++ -std=c++17 -o prog_cpp prog_cpp.cpp \
-pedantic -Wall -Wextra -Wconversion -Wno-sign-conversion \
-g -O0 -UNDEBUG -fsanitize=address,undefined -pthread
**/
#include <iostream>
#include <thread>
using namespace std::chrono_literals;
void
f(const int &x)
{
std::cout << "x=" << x << '\n';
std::this_thread::sleep_for(1000ms);
std::cout << "x=" << x << '\n';
}
int
main()
{
int i=1;
// std::thread th{f, i}; // copy to thread stack
std::thread th{f, std::cref(i)}; // reference the original i
std::this_thread::sleep_for(500ms);
i+=1;
th.join();
return 0;
}
我有两个功能
void f(const int &x) {}
void g(int& x) {}
我可以
int x = 0;
std::thread t1(f, x);
但我无法创建 std::thread t2(g, x)
,在这种情况下我需要创建 std::ref(x)
而不是 x
,为什么有必要?
以及为什么可以在没有 std::cref
的情况下创建 t1
?
如果没有 std::cref()
,您的 f()
功能将无法正常工作。
虽然f()
无意改变x
后面的值,但这并不意味着这个引用后面的值不能在别处改变。
在这个例子中,没有std::cref()
原始int
的副本被放入线程堆栈,x
引用这个副本;我们看到 1
和 1
.
另一方面,对于std::cref()
,x
仍然引用原作;我们看到 1
和 2
.
/**
g++ -std=c++17 -o prog_cpp prog_cpp.cpp \
-pedantic -Wall -Wextra -Wconversion -Wno-sign-conversion \
-g -O0 -UNDEBUG -fsanitize=address,undefined -pthread
**/
#include <iostream>
#include <thread>
using namespace std::chrono_literals;
void
f(const int &x)
{
std::cout << "x=" << x << '\n';
std::this_thread::sleep_for(1000ms);
std::cout << "x=" << x << '\n';
}
int
main()
{
int i=1;
// std::thread th{f, i}; // copy to thread stack
std::thread th{f, std::cref(i)}; // reference the original i
std::this_thread::sleep_for(500ms);
i+=1;
th.join();
return 0;
}