std::make_shared<std::thread>用法
时间: 2023-11-24 09:53:34 浏览: 70
以下是使用std::make_shared<std::thread>创建线程的示例代码:
```cpp
#include <iostream>
#include <thread>
#include <memory>
void thread_func(int n) {
std::cout << "Thread " << n << " is running." << std::endl;
}
int main() {
// 使用std::make_shared<std::thread>创建线程
auto t = std::make_shared<std::thread>(thread_func, 1);
t->join();
return 0;
}
```
在上面的示例代码中,我们使用std::make_shared<std::thread>创建了一个线程对象t,并将线程函数thread_func和参数1传递给了它。然后,我们调用了t的join()方法,等待线程执行完毕。
需要注意的是,使用std::make_shared<std::thread>创建线程时,需要将线程函数和参数一起传递给它,而不能像使用std::thread那样将参数单独传递给线程函数。
相关问题
std::make_shared<std::thread>
这是一个使用C++的标准库函数`std::make_shared`来创建一个共享指针的示例,该共享指针指向一个新创建的`std::thread`对象。`std::thread`是C++标准库中用于创建和管理线程的类。通过使用`std::make_shared`函数,可以直接创建一个包装了`std::thread`对象的共享指针,这样可以方便地管理线程的生命周期和资源释放。
示例代码如下:
```cpp
#include <iostream>
#include <thread>
#include <memory>
void threadFunc()
{
std::cout << "Hello from thread!" << std::endl;
}
int main()
{
std::shared_ptr<std::thread> threadPtr = std::make_shared<std::thread>(threadFunc);
// 等待线程执行完毕
threadPtr->join();
return 0;
}
```
以上代码中,`std::make_shared<std::thread>(threadFunc)`会创建一个新的`std::thread`对象,其中`threadFunc`是线程要执行的函数。然后,将返回的指针传递给`std::shared_ptr<std::thread>`类型的共享指针`threadPtr`进行管理。最后调用`join()`函数等待线程执行完毕并释放资源。
希望能解答您的问题!如果还有其他问题,请随时提问。
std::make_shared<std::thread> 带参函数
如果你想使用 `std::make_shared` 创建一个带参数的函数对象或函数指针,可以使用 `std::bind` 或者 lambda 表达式来实现。下面是一个使用 `std::bind` 的例子:
```c++
#include <memory>
#include <thread>
#include <functional>
void foo(int x, double y) {
// do something
}
int main() {
auto t = std::make_shared<std::thread>(std::bind(foo, 42, 3.14));
t->join();
return 0;
}
```
在这个例子中,`std::bind` 接收一个函数对象或函数指针和一系列参数,然后返回一个绑定了这些参数的函数对象或函数指针。`std::make_shared` 接收一个 `std::thread` 对象的构造函数参数,因此我们可以将绑定后的函数对象传递给 `std::make_shared`,然后将返回的智能指针存储在 `t` 中。
你也可以使用 lambda 表达式来实现:
```c++
#include <memory>
#include <thread>
void foo(int x, double y) {
// do something
}
int main() {
auto t = std::make_shared<std::thread>([]() { foo(42, 3.14); });
t->join();
return 0;
}
```
在这个例子中,我们使用一个 lambda 表达式来包装函数调用,然后将 lambda 表达式传递给 `std::make_shared`。这种方法更加简洁,但是可能会使代码更加难以阅读。