#include<thread>
1.创建线程
thread t1(func,arg...);
其中func是函数名,arg...是传递给函数的参数
值得注意的是,arg一般不能是临时变量或者局部变量,因为线程在调用func的时候,变量不在func的局部作用内,就会报错。
2.等待线程和分离线程
t1.join();//等待线程结束再结束程序
t1.detach();//程序结束后,线程在后台进行
3.线程间的数据共享
#include<mutex>
mutex mtx;
方法一
mtx.lock();
......//数据操作
mtx.unlcok();
方法二
lock_guard<mutex> lock(mtx);
........;
自动上锁自动解锁
方法三
unique_lock<mutex>lock(mtx);
........;
lock方法和lock_guard作用基本一样
但是此处的方法更多
-
lock()
:尝试对互斥量进行加锁操作,如果当前互斥量已经被其他线程持有,则当前线程会被阻塞,直到互斥量被成功加锁。 -
try_lock()
:尝试对互斥量进行加锁操作,如果当前互斥量已经被其他线程持有,则函数立即返回false
,否则返回true
。 -
try_lock_for(const std::chrono::duration<Rep, Period>& rel_time)
:尝试对互斥量进行加锁操作,如果当前互斥量已经被其他线程持有,则当前线程会被阻塞,直到互斥量被成功加锁,或者超过了指定的时间。 -
try_lock_until(const std::chrono::time_point<Clock, Duration>& abs_time)
:尝试对互斥量进行加锁操作,如果当前互斥量已经被其他线程持有,则当前线程会被阻塞,直到互斥量被成功加锁,或者超过了指定的时间点。 -
unlock()
:对互斥量进行解锁操作。
4.进程同步
#include<condition_variable>
条件变量和OS中的PV操作有点相似
-
创建一个
std::condition_variable
对象。 -
创建一个互斥锁
std::mutex
对象,用来保护共享资源的访问。 -
在需要等待条件变量的地方
使用
std::unique_lock<std::mutex>
对象锁定互斥锁并调用
std::condition_variable::wait()
、std::condition_variable::wait_for()
或std::condition_variable::wait_until()
函数等待条件变量。 -
在其他线程中需要通知等待的线程时,调用
std::condition_variable::notify_one()
或std::condition_variable::notify_all()
函数通知等待的线程。