td::thread 各种构造函数例子如下:
#include <iostream> #include <utility> #include <thread> #include <chrono> #include <functional> #include <atomic> void f1(int n) { for (int i = 0; i < 5; ++i) { std::cout << "Thread " << n << " executing "; 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; std::this_thread::sleep_for(std::chrono::milliseconds(10)); } } int main() { int n = 0; std::thread t1; // t1 is not a thread std::thread t2(f1, n + 1); // pass by value std::thread t3(f2, std::ref(n)); // pass by reference std::thread t4(std::move(t3)); // t4 is now running f2(). t3 is no longer a thread t2.join(); t4.join(); std::cout << "Final value of n is " << n << ' '; }
root@ubuntu:~/c++# g++ -std=c++11 -pthread obj.cpp -o obj root@ubuntu:~/c++# ./obj Thread 1 executing Thread 2 executing Thread 1 executing Thread 2 executing Thread 1 executing Thread 2 executing Thread 1 executing Thread 2 executing Thread 1 executing Thread 2 executing Final value of n is 5 root@ubuntu:~/c++#
int main() { int n = 0; std::thread t1; // t1 is not a thread std::thread t2(f1, n + 1); // pass by value std::thread t3(f2, std::ref(n)); // pass by reference t2.join(); t3.join(); std::thread t4(std::move(t3)); // t4 is now running f2(). t3 is no longer a thread t4.join(); std::cout << "Final value of n is " << n << ' '; }
root@ubuntu:~/c++# g++ -std=c++11 -pthread obj.cpp -o obj root@ubuntu:~/c++# ./obj Thread Thread 2 executing 1 executing Thread 2 executing Thread 1 executing Thread 2 executing Thread 1 executing Thread 2 executing Thread 1 executing Thread 2 executing Thread 1 executing terminate called after throwing an instance of 'std::system_error' what(): Invalid argument Aborted root@ubuntu:~/c++#
int main() { int n = 0; std::thread t1; // t1 is not a thread std::thread t2(f1, n + 1); // pass by value std::thread t3(f2, std::ref(n)); // pass by reference t2.join(); t3.join(); std::thread t4(std::move(t3)); // t4 is now running f2(). t3 is no longer a thread //t4.join(); std::cout << "Final value of n is " << n << ' '; }
root@ubuntu:~/c++# g++ -std=c++11 -pthread obj.cpp -o obj root@ubuntu:~/c++# ./obj Thread 1 executing Thread 2 executing Thread 1 executing Thread 2 executing Thread 1 executing Thread 2 executing Thread 1 executing Thread 2 executing Thread 1 executing Thread 2 executing Final value of n is 5 root@ubuntu:~/c++#
std::thread 赋值操作
Move 赋值操作 | thread& operator=(thread&& rhs) noexcept; |
---|---|
拷贝赋值操作 [deleted] | thread& operator=(const thread&) = delete; |
- Move 赋值操作(1),如果当前对象不可
joinable
,需要传递一个右值引用(rhs
)给move
赋值操作;如果当前对象可被joinable
,则会调用terminate
() 报错。 - 拷贝赋值操作(2),被禁用,因此
std::thread
对象不可拷贝赋值。
#include <iostream> #include <utility> #include <thread> #include <chrono> #include <functional> #include <atomic> #include <vector> std::vector<std::thread> vthreads; int n=0; void f1(int n) { for (int i = 0; i < 5; ++i) { std::cout << "Thread " << n << " executing "; 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; std::this_thread::sleep_for(std::chrono::milliseconds(10)); } } int create_thread() { std::thread t2(f1, n + 1); // pass by value std::thread t3(f2, std::ref(n)); // pass by reference vthreads.push_back(std::move(t2)); vthreads.push_back(std::move(t3)); } int main() { create_thread(); // for(auto it = vthreads.begin(); it != vthreads.end(); ++it) // { // it->join(); // } for ( auto & th :vthreads) { th.join(); } std::cout << "Final value of n is " << n << ' '; return 0; }
root@ubuntu:~/c++# g++ -std=c++11 -pthread obj.cpp -o obj root@ubuntu:~/c++# ./obj Thread Thread 2 executing 1 executing Thread 2 executing Thread 1 executing Thread 2 executing Thread 1 executing Thread 2 executing Thread 1 executing Thread 2 executing Thread 1 executing Final value of n is 5