C++线程操作
定义
std::thread必须明确调用join()或detach(),否则程序终止时会调用std::terminate()
| 特性 | std::thread |
std::jthread |
|---|---|---|
| 引入标准 | C++11 | C++20 |
| 资源管理 | 析构时若仍可汇合(joinable)会调用std::terminate终止程序 |
析构时若仍可汇合,会**自动调用join()**,等待线程结束 |
| 协作中断 | 不支持 原生协作中断机制 | 支持 ,通过 request_stop() 请求停止,线程内可查询停止状态 |
| 成员函数 | join(), detach(), get_id(), joinable()等 |
包含std::thread所有功能,并增加 request_stop(), get_stop_source(), get_stop_token() |
| 推荐使用 | 旧代码维护,或需要手动控制线程生命周期 | 新项目首选,更安全,资源管理更自动化 |
cpp
void sayHello() {
std::this_thread::sleep_for(std::chrono::seconds(3));
std::cout << getStringFromU8string(u8"Hello World,子线程, threadId=") + getThreadIdAsString() + "\n";
}
int main()
{
system("chcp 65001");
std::cout << getStringFromU8string(u8"开始主线程,threadId=") << std::this_thread::get_id() << endl;
std::thread thread1(sayHello);
//std::jthread thread2(sayHello);
// thread必须显式调用
// thread1.join();
//
// jthread会自动调用join方法
//thread2.join();
std::cout << getStringFromU8string(u8"结束主线程,threadId=") << std::this_thread::get_id() << endl;
return 0;
}
构造函数
1、通过函数指针
带返回值的函数,需要用到其他方式
cpp
#include <iostream>
#include <string>
#include <thread>
using namespace std;
std::string getStringFromU8string(const std::u8string& u8str) {
return std::string(reinterpret_cast<const char*>(u8str.data()), u8str.size());
}
std::u8string getU8stingFromString(const std::string& str) {
return std::u8string(reinterpret_cast<const char8_t*>(str.data()), str.size());
}
void sayHello() {
std::cout << getStringFromU8string(u8"Hello World,子线程, threadId=") << std::this_thread::get_id() << endl;
}
void add(int a, int b) {
std::cout << getStringFromU8string(u8"Hello World,子线程, threadId=") << std::this_thread::get_id() << " ;a+b=" << (a + b) << endl;
}
int main()
{
system("chcp 65001");
std::cout << getStringFromU8string(u8"开始主线程,threadId=") << std::this_thread::get_id() << endl;
// 无参,无返回
std::thread thread1(sayHello);
// 有参,无返回
std::thread thread2(add, 2, 3);
// 等待线程结束(阻塞主线程)
thread1.join();
thread2.join();
std::cout << getStringFromU8string(u8"结束主线程,threadId=") << std::this_thread::get_id() << endl;
return 0;
}
2、通过Lambda 表达式
cpp
int main()
{
system("chcp 65001");
std::cout << getStringFromU8string(u8"开始主线程,threadId=") << std::this_thread::get_id() << endl;
// 无参,无返回
std::thread thread1([]() {std::cout << getStringFromU8string(u8"Hello World,子线程, threadId=") << std::this_thread::get_id() << endl; });
// 有参,无返回
std::thread thread2([](int a, int b) {std::cout << getStringFromU8string(u8"Hello World,子线程, threadId=") << std::this_thread::get_id() << " ;a+b=" << (a + b) << endl; }, 2, 3);
// 等待线程结束(阻塞主线程)
thread1.join();
thread2.join();
std::cout << getStringFromU8string(u8"结束主线程,threadId=") << std::this_thread::get_id() << endl;
return 0;
}
3、通过成员函数
cpp
#include <iostream>
#include <string>
#include <thread>
#include <sstream>
using namespace std;
std::string getStringFromU8string(const std::u8string& u8str) {
return std::string(reinterpret_cast<const char*>(u8str.data()), u8str.size());
}
std::u8string getU8stingFromString(const std::string& str) {
return std::u8string(reinterpret_cast<const char8_t*>(str.data()), str.size());
}
std::string getThreadIdAsString() {
std::stringstream ss;
ss << std::this_thread::get_id();
return ss.str();
}
class Hello {
public:
void sayHello() {
std::cout << getStringFromU8string(u8"Hello World,子线程, threadId=") + getThreadIdAsString() + "\n";
}
void add(int a, int b) {
std::cout << getStringFromU8string(u8"Hello World,子线程, threadId=") + getThreadIdAsString() + " ;a+b=" + std::to_string(a + b) + "\n";
}
static void staticAdd(int a, int b) {
std::cout << getStringFromU8string(u8"Hello World,子线程, threadId=") + getThreadIdAsString() + " ;a+b=" + std::to_string(a + b) + "\n";
}
};
int main()
{
system("chcp 65001");
std::cout << getStringFromU8string(u8"开始主线程,threadId=") << std::this_thread::get_id() << endl;
Hello hello;
// 无参,无返回
std::thread thread1(&Hello::sayHello, &hello);
// 有参,无返回
std::thread thread2(&Hello::add, &hello, 2, 3);
// 有参,无返回(静态方法)
std::thread thread3(&Hello::staticAdd, 5, 6);
// 等待线程结束(阻塞主线程)
thread1.join();
thread2.join();
thread3.join();
std::cout << getStringFromU8string(u8"结束主线程,threadId=") << std::this_thread::get_id() << endl;
return 0;
}
4、拷贝构造函数
已删除,不支持
5、移动构造函数
cpp
int main()
{
system("chcp 65001");
std::cout << getStringFromU8string(u8"开始主线程,threadId=") << std::this_thread::get_id() << endl;
Hello hello;
std::thread thread1(&Hello::sayHello, &hello);
// 移动构造函数,原thread1失效不可用了
std::thread thread2(std::move(thread1));
// 等待线程结束(阻塞主线程)
// thread1.join();
thread2.join();
std::cout << getStringFromU8string(u8"结束主线程,threadId=") << std::this_thread::get_id() << endl;
return 0;
}