std::thread()和std::thread{}
时间: 2023-11-23 13:52:42 浏览: 82
std::thread()和std::thread{}都是创建一个新线程的方式,但它们的初始化方式不同。std::thread()使用默认构造函数初始化,而std::thread{}使用值初始化。在使用std::thread()时,如果没有提供可调用对象,将会抛出std::system_error异常。而使用std::thread{}时,如果没有提供可调用对象,则会创建一个默认构造的std::thread对象,该对象不包含任何执行线程。因此,建议使用std::thread{}来创建新线程,以避免不必要的异常。
相关问题
std::function thread
`std::function` 和 `std::thread` 是 C++ 标准库中的两个不同概念。
`std::function` 是一个模板类,它允许你在运行时存储并执行任意类型的函数或函数指针。它提供了一种通用的方式来传递和处理回调,使得可以在不需要知道具体函数签名的情况下对它们进行操作。
而 `std::thread` 是线程库的一部分,用于创建、启动和管理线程。它允许你将一段代码作为线程任务,并在新的线程上执行,从而实现并发执行。
当你想要在一个线程中使用函数时,可以这样做:
```cpp
#include <iostream>
#include <thread>
void my_function(int x) {
std::cout << "Function with argument: " << x << '\n';
}
int main() {
// 创建一个 std::function 对象,存储 my_function 函数引用
std::function<void(int)> func = my_function;
// 使用 std::thread 来启动一个新的线程,传入 std::function 对象
std::thread worker_thread(func, 42);
// 主线程继续执行其他任务,worker_thread 子线程也在执行
// 等待 worker_thread 完成(此处未显示等待)
worker_thread.join();
return 0;
}
```
std::this_thread和std::thread区别
std::this_thread和std::thread是C++中的两个线程相关的类。它们之间有以下区别:
1. std::this_thread是一个命名空间,提供了与当前线程相关的函数,如std::this_thread::yield和std::this_thread::sleep_for。这些函数允许当前线程放弃执行或休眠一段时间。
2. std::thread是一个类,用于创建和管理线程。通过std::thread,可以创建一个新的线程并指定要执行的函数或可调用对象。std::thread提供了一些成员函数,如join()和detach(),用于等待线程完成或分离线程。
下面是一个示例,演示了std::this_thread和std::thread的区别:
```cpp
#include <iostream>
#include <thread>
#include <chrono>
void threadFunction()
{
std::cout << "Thread is running" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << "Thread is done" << std::endl;
}
int main()
{
std::thread t(threadFunction);
std::cout << "Main thread is running" << std::endl; std::this_thread::yield();
std::cout << "Main thread is done" << std::endl;
t.join();
return 0;
}
```
在上面的示例中,我们创建了一个新的线程t,并在其中执行threadFunction函数。在主线程中,我们使用std::this_thread::yield()让出CPU时间片给其他线程,并使用std::this_thread::sleep_for()休眠2秒钟。最后,我们使用t.join()等待线程t完成。
阅读全文