C++多线程回调函数如何实现?
时间: 2024-09-15 18:10:30 浏览: 50
C++ 中回调函数详解及简单实例
在C++中,多线程回调函数通常通过多种方式实现,最常见的是使用`std::thread`库提供的成员函数`detach`和`async`,或者是通过`std::function`, `std::bind`或者lambda表达式来传递函数引用给线程。这里分别介绍这两种常见的方法:
1. **使用`std::thread::detach`和`std::future`**
- 创建线程时,你可以将一个函数作为参数传递给`std::thread`的构造函数,例如:
```cpp
void threadFunction(int param) {
// 线程执行的代码
}
std::thread t(threadFunction, 42); // 传入回调函数和参数
// 线程启动后,主线程继续执行
t.detach(); // 将线程从主进程分离出去
// 如果需要异步的结果,可以使用`std::future`:
auto future = t.get_future();
// ... 然后在你需要的时候获取结果,比如通过`future.wait_for`和`future.get()`
```
2. **使用`std::function`或`std::bind`**
- `std::function`允许你在运行时动态地存储和执行一个函数:
```cpp
std::function<void()> callback = std::bind(&threadFunction, 42);
std::thread t(callback); // 线程启动时执行该回调函数
t.join(); // 等待线程结束
```
或者
```cpp
void (*callback)(int) = &threadFunction;
std::thread t(callback, 42); // 直接传递指向函数的指针
```
3. **使用Lambda表达式(C++11及以上版本)**
- 利用现代C++的特性,你可以直接在构造线程时定义一个匿名函数:
```cpp
std::thread t([param](void){ threadFunction(param); }, 42); // 匿名函数作为参数
```
在上述所有方法中,回调函数都是异步执行的,当线程完成工作后,如果没有指定特定的方式去接收结果(如`std::future`),那么通常会立即返回,而不会阻塞主线程。
阅读全文