C++ 线程
来自《深入应用C++11 代码优化与工程级应用》
1.
#include <thread>
void func()
{
//do some work
}
int main()
{
std::thread t(func);
t.join();
return 0;
}
函数func将运行于线程对象t中,join函数会阻塞线程,直到线程函数执行结束。
2.
#include <thread>
#include <iostream>
void func()
{
//do some work
std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::this_thread::get_id()<<'\n';
}
int main()
{
std::thread t(func);
std::cout<<__FILE__<<"["<<__LINE__<<"]"<<t.get_id()<<'\n';
t.join();
std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::thread::hardware_concurrency()<<'\n';
std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::this_thread::get_id()<<'\n';
return 0;
}
...\demo\main.cpp[12]2
..\demo\main.cpp[6]2
..\demo\main.cpp[14]8
..\demo\main.cpp[15]1
线程对象t的id是2
主线程的id是1
CPU核心数量是8
线程对象就代表着一个线程。
需要注意线程对象的生命周期。
3.
#include <thread>
#include <iostream>
void func()
{
//do some work
std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::this_thread::get_id()<<'\n';
std::this_thread::sleep_for(std::chrono::seconds(3));
std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::this_thread::get_id()<<'\n';
}
int main()
{
std::thread t(func);
std::cout<<__FILE__<<"["<<__LINE__<<"]"<<t.get_id()<<'\n';
t.join();
std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::this_thread::get_id()<<'\n';
return 0;
}
..\demo\main.cpp[14]2
..\demo\main.cpp[6]2
..\demo\main.cpp[8]2
..\demo\main.cpp[16]1
注意程序的执行顺序
4.
线程异步和线程同步
什么是线程同步和线程异步?_同步线程和异步线程-CSDN博客
5.线程异步操作函数async
#include <thread>
#include <future>
#include <iostream>
int main()
{
std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::this_thread::get_id()<<'\n';
std::future<int> f1 = std::async(std::launch::async,[](){
std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::this_thread::get_id()<<'\n';
std::this_thread::sleep_for(std::chrono::seconds(15));
std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::this_thread::get_id()<<'\n';
return 8;
});
std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::this_thread::get_id()<<'\n';
std::cout<<f1.get()<<std::endl;
std::this_thread::sleep_for(std::chrono::seconds(3));
std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::this_thread::get_id()<<'\n';
return 0;
}
可以看到,应该是第16行和第21行同时执行了。
实际的话:
.\thread\main.cpp[21]1
..\thread\main.cpp[16]2
std::launch::async
在调用async时就开始创建线程
修改代码:
std::launch::deferred
延迟加载方式创建线程。调用async时不创建线程,直到调用了future的get或者wait时才创建线程。