std::thread
是 C++ 标准库中的一个类,用于创建和管理线程。std::thread
对象表示一个线程的抽象,可以用来执行一个函数或可调用对象。
Lambda 表达式是 C++11 引入的一种匿名函数,可以在代码中定义简短的函数对象。Lambda 表达式非常适合用作 std::thread
的参数,因为它们可以捕获周围作用域中的变量,并且语法简洁。
Lambda 表达式有多种形式,但最常见的是以下两种:
Lambda 表达式与 std::thread
结合使用的主要应用场景包括:
以下是一个通过 Lambda 表达式将函数转发到 std::thread
的示例:
#include <iostream>
#include <thread>
int main() {
// 定义一个 Lambda 表达式
auto my_lambda = []() {
std::cout << "Hello from thread!" << std::endl;
};
// 创建一个 std::thread 对象,并传递 Lambda 表达式
std::thread t(my_lambda);
// 等待线程完成
t.join();
return 0;
}
原因:可能是由于捕获列表中的变量类型不匹配或变量未正确声明。
解决方法:确保捕获列表中的变量类型和名称正确,并且变量在 Lambda 表达式的作用域内。
#include <iostream>
#include <thread>
int main() {
int x = 10;
// 错误的捕获方式
// auto my_lambda = []() { std::cout<< x << std::endl; }; // 编译错误
// 正确的捕获方式
auto my_lambda = [x]() { std::cout<< x << std::endl; };
std::thread t(my_lambda);
t.join();
return 0;
}
原因:多线程程序的执行顺序是不确定的,因为线程调度由操作系统决定。
解决方法:如果需要确保线程执行的顺序,可以使用同步机制,如 std::mutex
或 std::condition_variable
。
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
void print_block(int n, char c) {
for (int i = 0; i < n; ++i) {
std::lock_guard<std::mutex> lock(mtx);
std::cout << c;
}
std::cout << '\n';
}
int main() {
std::thread th1(print_block, 50, '*');
std::thread th2(print_block, 50, '$');
th1.join();
th2.join();
return 0;
}
希望这些信息对你有所帮助!
领取专属 10元无门槛券
手把手带您无忧上云