学习内容:
1. <thread>:提供了多线程编程的基本功能,包括创建线程、线程的启动和终止,以及线程间的通信和同步。
2. <mutex>:提供了互斥锁和其他线程间同步原语,用于确保多个线程可以安全地访问共享资源。它包括互斥锁、递归锁、读写锁、条件变量等。
3. <condition_variable>:提供了条件变量机制,用于在线程之间进行条件通知和等待。它可以用于实现线程的等待和唤醒操作。
4. <future>:提供了异步编程的支持,可以让一个线程在后台执行一个任务,并返回一个异步的结果。它包括std::async、std::future、std::promise等。
5. <atomic>:提供了原子操作的支持,用于保证多个线程对共享变量的操作的原子性。它包括原子类型和原子操作函数。
创建线程只需要把函数添加到线程当中即可。
形式1:
std::thread myThread (thread_fun);
//函数形式为void thread_fun()
myThread.join();
//同一个函数可以代码复用,创建多个线程
形式2:
std::thread myThread (thread_fun(100));
myThread.join();
//函数形式为void thread_fun(int x)
//同一个函数可以代码复用,创建多个线程
形式3:
std::thread (thread_fun,1).detach();
//直接创建线程,没有名字
//函数形式为void thread_fun(int x)
/*
std::thread(thread_func, 1).detach();的意思是创建一个新线程,该线程执行thread_func函数,并将数字1作为参数传递给thread_func函数。然后,通过调用detach()函数,将该线程与当前线程分离,使其成为一个独立的后台线程。
*/
#include <iostream>
#include <thread>
void myThreadFunc() {
// 线程要执行的代码
std::cout << "Thread executing" << std::endl;
}
int main() {
// 创建线程
std::thread myThread(myThreadFunc);
// 启动线程
myThread.join();
return 0;
}
std::thread
类中的join()
和detach()
函数是用于控制线程的结束和资源管理的两种方式。
join()
函数:
join()
函数将等待线程执行完成,并阻塞当前线程,直到被等待的线程结束。join()
函数后,将无法再使用被等待线程的std::thread
对象。join()
函数可以确保线程的完成,并避免线程被提前销毁导致的资源泄漏。detach()
函数:
detach()
函数将分离线程,使得线程能够在后台继续执行,与主线程并行。detach()
函数后,被分离的线程将在执行完毕后自行销毁,无需显式地等待。detach()
函数应该确保线程能够独立运行,并且不再需要对其进行管理或等待。detach()
函数,就无法再使用join()
函数等待线程的结束。如果没有调用join()
或detach()
函数,而直接析构了std::thread
对象,则程序会终止并报错。if (myThread.joinable()) foo.join();
在选择join()
和detach()
时,需要根据具体情况判断是否需要等待线程的完成和资源的管理。