dlaczego użyto std::ref ?

0

Dlaczegoż w takim przykładzie trzeba użyć std::ref ?

void func_1(int& x)
{
	while (true)
	{
		std::cout << "func_1 x value : " << x << std::endl;
		std::this_thread::sleep_for(std::chrono::milliseconds(1000));
	}
}
std::thread thread_1(func_1, std::ref(x));

albo w takim przykładzie, tez działa poprawnie tylko parametr std::ref(n2) a nie działa n1

#include <functional>
#include <iostream>
 
void f(int& n1, int& n2, const int& n3)
{
    std::cout << "In function: " << n1 << ' ' << n2 << ' ' << n3 << '\n' 
    << "&n1 = " <<  &n1 << '\n'
    << "&n2 = " <<  &n2 << '\n'
    << "&n3 = " <<  &n3 << '\n';

    ++n1; // increments the copy of n1 stored in the function object
    ++n2; // increments the main()'s n2
    // ++n3; // compile error
}
 
int main()
{
    int n1 = 1, n2 = 2, n3 = 3;
    std::function<void()> bound_f = std::bind(f, n1, std::ref(n2), std::cref(n3));
    n1 = 10;
    n2 = 11;
    n3 = 12;
    std::cout << "Before function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
    bound_f();
    std::cout << "After function: " << n1 << ' ' << n2 << ' ' << n3 << '\n'
    << "&n1 = " <<  &n1 << '\n'
    << "&n2 = " <<  &n2 << '\n'
    << "&n3 = " <<  &n3 << '\n';
}
2

https://en.cppreference.com/w/cpp/thread/thread/thread
NOTES

The arguments to the thread function are moved or copied by value. If a reference argument needs to be passed to the thread function, it has to be wrapped (e.g., with std::ref or std::cref).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.