注意成员函数以及【operator()】的使用 std::ref 关键字 noexcept :告诉编译器函数不会出现异常
#include <iostream>#include <utility>#include <thread>#include <chrono>void f1(int n){for (int i = 0; i < 5; ++i) {std::cout << "Thread 1 executing\n";++n;std::this_thread::sleep_for(std::chrono::milliseconds(10));}}void f2(int& n){for (int i = 0; i < 5; ++i) {std::cout << "Thread 2 executing\n";++n;std::this_thread::sleep_for(std::chrono::milliseconds(10));}}class foo{public:void bar(){for (int i = 0; i < 5; ++i) {std::cout << "Thread 3 executing\n";++n;std::this_thread::sleep_for(std::chrono::milliseconds(10));}}int n = 0;};class baz{public:void operator()(){for (int i = 0; i < 5; ++i) {std::cout << "Thread 4 executing\n";++n;std::this_thread::sleep_for(std::chrono::milliseconds(10));}}int n = 0;};int main(){int n = 0;foo f;baz b;std::thread t1; // t1 is not a threadstd::thread t2(f1, n + 1); // pass by valuestd::thread t3(f2, std::ref(n)); // pass by referencestd::thread t4(std::move(t3)); // t4 is now running f2(). t3 is no longer a threadstd::thread t5(&foo::bar, &f); // t5 runs foo::bar() on object fstd::thread t6(b); // t6 runs baz::operator() on a copy of object bt2.join();t4.join();t5.join();t6.join();std::cout << "Final value of n is " << n << '\n';std::cout << "Final value of f.n (foo::n) is " << f.n << '\n';std::cout << "Final value of b.n (baz::n) is " << b.n << '\n';}
std::ref
std::ref 与 std::cref区别:
c代表const,即传 const 引用,只读!
#include <functional>#include <iostream>void f(int& n1, int& n2, const int& n3){std::cout << "In function: " << n1 << ' ' << n2 << ' ' << 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';}Before function: 10 11 12In function: 1 11 12After function: 10 12 12
