std::thread运行一个类中的成员函数
时间: 2023-10-14 14:22:28 浏览: 92
可以使用`std::thread`的构造函数来启动一个类中的成员函数。需要注意的是,成员函数需要通过一个指针来调用,因为成员函数需要一个隐式的`this`指针作为参数。
以下是一个示例代码:
```c++
#include <iostream>
#include <thread>
class MyClass {
public:
void myFunction() {
std::cout << "Hello from MyClass::myFunction!" << std::endl;
}
};
int main() {
MyClass obj;
std::thread t(&MyClass::myFunction, &obj);
t.join();
return 0;
}
```
在这个示例中,我们创建了一个`MyClass`对象`obj`,然后通过`std::thread`的构造函数启动了`obj`的成员函数`myFunction`。注意到我们传递了一个指向`obj`的指针`&obj`作为第二个参数,这是因为`myFunction`需要一个`this`指针作为参数。
最后,我们调用了`std::thread`对象的`join`方法,等待线程完成。
相关问题
std::thread 引用一个类中的函数
`std::thread`是C++标准库中用于线程处理的类,它允许你在新线程中执行一段代码。引用一个类中的函数作为线程的目标(即线程执行的内容)通常涉及以下步骤:
1. **定义目标函数**:首先,你需要在一个类中定义一个成员函数,这个函数是你想要在线程中运行的。例如:
```cpp
class MyClass {
public:
void myFunction() {
// 函数体
}
};
```
2. **创建线程**:然后,在另一个函数中,你可以使用`std::thread`来启动一个新的线程,并传递一个指向类中成员函数的指针或函数对象:
```cpp
MyClass myInstance;
std::thread myThread(&MyClass::myFunction, &myInstance); // 使用成员函数指针
// 或者使用std::bind
std::thread myThread(std::bind(&MyClass::myFunction, std::ref(myInstance)));
```
这里的`&MyClass::myFunction`获取的是`myFunction`的函数地址,而`std::ref(myInstance)`创建了一个可修改的引用,以便在函数中访问`myInstance`。
3. **启动和等待**:调用`start()`方法来启动线程,如果希望主线程等待线程结束,可以使用`join()`方法:
```cpp
myThread.start();
// 如果希望主线程等待myThread完成
myThread.join();
```
std::thread 成员函数
`std::thread`是C++标准库中的一个线程处理类,用于创建和管理线程。它的一些主要成员函数包括:
1. **ctor/dtor (构造/析构)**:
- `std::thread(const std::function<void()>& func)` 或 `std::thread(std::thread::id id, void(*)()`:构造函数接收一个可调用对象(如函数指针、lambda表达式)作为线程执行的目标。
- `~thread()`:析构函数,在线程结束时自动调用,清理资源。
2. **start()**:
- `void start()`:开始执行线程。如果线程已经启动,这将抛出异常。
3. **join()**:
- `void join()`:等待线程完成。调用者会阻塞直到线程执行完毕。
- `bool join_for(time_t timeout)`:带超时的版本,可以设置最大等待时间。
4. **detach()**:
- `void detach()`:从当前线程分离该线程,使其独立运行。不再关心线程是否终止。
5. **id() const**:
- `thread::id id()`:返回线程ID,表示线程的唯一标识符。
6. **interrupt()** 和 **try_join_for()**:
- `void interrupt()`:中断正在执行的线程。
- `bool try_join_for(time_t timeout)`:尝试在一个指定的时间内等待线程结束,如果没有完成则返回false。
7. **native_handle() const**:
- `native_thread_t native_handle()`:提供底层操作系统线程的原始句柄,用于更底层的操作。
8. **get_id() const**:
- `const thread::id& get_id()`:获取线程ID的引用。
以上是一些主要的成员函数,使用它们可以创建、控制和操作C++11及更高版本中的线程。
阅读全文