前言:我认为作为一名C++程序员掌握多线程编程还是很有好处的,在C++11出来之后,有一个std::thread库可以供我们使用,来编写多线程程序;
首先我们需要了解C++11中多线程编程需要涉及的标准库
与C++11多线程相关的头文件
C++11新标准一共提供了五个标准库来支持多线程编程,分别是<thread>,<atomic>,<mutex>,<conditinon_variable>and<future>
<thread>:主要声明了std::thread类
<atomic>:主要声明了两个类,std::atomic和std::atomic_flag
<mutex>:主要声明了与互斥量(mutex)相关的类,包括std::mutex,std::lock_guard,std::unique_lock等
<condition_variable>:主要声明了与条件变量相关的类,包括std::condition_variable和std::condition_variable_any
<future>:主要声明std::promise,std::package_task两个Provider类,以及std::future和std::share_future两个Future类
使用thread类的例子
#include <iostream> // std::cout
#include <thread> // std::thread
void thread_task() {
std::cout << "hello thread" << std::endl;
}
int main(int argc, const char *argv[])
{
std::thread t(thread_task);
t.join();
return EXIT_SUCCESS;
}
default | thread() noexcept; |
initialization | template <class Fn, class... Args> explicit thread (Fn&& fn, Args&&... args); |
copy | thread(const thread&)=delete |
move | thread(thread&& T) noexcept; |
1、默认构造函数,构造一个空的thread对象
2、初始化构造函数,创建一个thread对象,该对象可以被joinable,新产生的线程会调用fn函数,该函数的参数由args给出
3、拷贝构造函数被禁用,意思是thread不能被拷贝构造
4、move构造函数
可被joinable的对象必须在销毁之前jion主线程或者被detached
thread构造函数使用的例子
#include <iostream>
#include <utility>
#include <thread>
#include <chrono>
#include <functional>
#include <atomic>
void f1(int n)
{
for (int i = 0; i < 5; ++i) {
std::cout << "Thread 1 executing\n";
++n;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
void f2(int& n)
{
for (int i = 0; i < 5; ++i) {
std::cout << "Thread 2 executing\n";
++n;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
int main()
{
int n = 0;
std::thread t1; // t1 is not a thread
std::thread t2(f1, n + 1); // pass by value
std::thread t3(f2, std::ref(n)); // pass by reference
std::thread t4(std::move(t3)); // t4 is now running f2(). t3 is no longer a thread
t2.join();
t4.join();
std::cout << "Final value of n is " << n << '\n';
}
注意:t2里面的n+1是f1的参数,为值传递;t3里面的是引用传递需要使用std::ref()函数
可能的结果:
Thread 1 executing
Thread 2 executing
Thread 1 executing
Thread 2 executing
Thread 1 executing
Thread 2 executing
Thread 1 executing
Thread 2 executing
Thread 2 executing
Thread 1 executing
Final value of n is 5
move复制操作
move | thread& operator=(thread&& T) noexcept; |
copy | thread& operator=(const thread&)=delete; |
其他常用相关函数
get_id() | 获取线程编号 |
joinable() | 判断是否可以join |
join() | 加入线程 |
detach() | 分离线程 |
swap() | 交换线程 |
native_handle() | 返回native_handle |
注意:detach()是将本线程分离出去,允许本线程单独执行,但是当主线程结束的时候,分离出去的子线程有没有结束都会被强制kill
未完待续。。。。。。。。。。