C++创建线程的三种方式
早期的C++并不支持多线程的创建,如果要创建多线程,依赖的是系统提供的一些方法(例如linux的 pthread). 从C++11以后开始,提供了std::thread线程库,因此我们可以创建std::thread类对象的方式来创建线程。创建的方式主要有三种:
创建线程的三种方式:
- 通过函数指针
- 通过函数对象
- 通过lambda函数
使用std::thread类创建对象,必须包含头文件
#include <thread>
创建的形式是
std::thread thobj(<CALL_BACK>)
新线程将在创建新对象后立即启动,并将与启动该线程的线程并行执行传递的回调。而且,任何线程都可以通过在该线程的对象上调用join()函数来等待另一个线程退出。
通过函数指针创建线程
#include <iostream>
#include <thread>
#include <chrono>
using namespace std;
void thread_func()
{
for(int i= 0; i< 10; ++i)
{
cout<<" thread thread_func is running..."<< endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
int main()
{
thread threadobj(thread_func);
cout<<"main Thread is running..."<<endl;
threadobj.join();
cout<<" exit from main Thread"<<endl;
return 0;
}
需要注意的是, thread threadobj(thread_func), 函数名是不加括号的。文章来源:https://www.toymoban.com/news/detail-589229.html
通过函数对象创建线程
#include <iostream>
#include <thread>
#include <chrono>
using namespace std;
class Thread_Test
{
public:
void operator()()
{
for(int i = 0; i < 10; i++)
{
cout<<" Thread_Test is running..."<<endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
};
int main()
{
thread threadobj((Thread_Test()));
cout<<"main Thread is running..."<<endl;
threadobj.join();
cout<<" exit from main Thread"<<endl;
return 0;
}
与上面的方法对比,此处对象Thread_Test()是必须要加括号的.关于operator() 函数对象(仿函数)的相关知识不在这里展开。文章来源地址https://www.toymoban.com/news/detail-589229.html
lambda函数创建线程
#include <iostream>
#include <thread>
#include <chrono>
using namespace std;
int main()
{
cout<<"main Thread is running..."<<endl;
thread threadobj([]{
for (int i = 0; i < 10; i++)
{
cout<<"lambda thread is running ..." <<endl;
::this_thread::sleep_for(::chrono::seconds(1));
}
});
threadobj.join();
cout<<" exit from main Thread"<<endl;
return 0;
}
到了这里,关于C++创建线程的三种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!