在 C++1x 之后,多线程编程可以直接使用标准库里的函数,如#include <thread>,#include <mutex>不必根据平台的不同使用 posix_thread 之类的库了,即实现了跨平台的编程。
本次是将日常用到的创建多线程方法以及锁的简单实现进行总结:
#include <iostream>
#include <thread>
#include <stdlib.h>
#include <windows.h>
#include <mutex>
using namespace std;
const int nt = 8;
mutex mtx; // 互斥锁
void func1()
{
/*
利用lock_guard加锁;
定义lock_guard的时候调用构造函数加锁,大括号解锁的时候调用析构函数解锁;
*/
lock_guard<mutex> lock(mtx);
for (int i = 0; i < 3; i++) {
cout << "thread id is " << this_thread::get_id() << ", " << "i is " << i << endl;
Sleep(1000);
}
}
void func2()
{
/*
利用unique_lock加锁;
可以利用 unique.unlock() 随时解锁,减小锁的粒度;
缺点是内部会维护一个锁的状态,效率比lock_guard低一点;
注:析构的时候会判断当前锁的状态来决定是否解锁,如果当前状态已经是解锁状态了,
那么就不会再次解锁,而如果当前状态是加锁状态,就会自动调用unique.unlock()来解锁。
*/
unique_lock<mutex> unique(mtx);
for (int i = 0; i < 3; i++) {
cout << "thread id is " << this_thread::get_id() << ", " << "i is " << i << endl;
Sleep(1000);
}
// unique.unlock();
}
void func3()
{
/*
利用mtx.lock()加锁;
利用 mtx.unlock() 随时解锁,减小锁的粒度;
通用方法;
*/
mtx.lock();
for (int i = 0; i < 3; i++) {
cout << "thread id is " << this_thread::get_id() << ", " << "i is " << i << endl;
Sleep(1000);
}
mtx.unlock();
}
int main()
{
thread t[nt];
// 创建线程
for (int i = 0; i < nt; i++) {
t[i] = thread(func3);
thread::id pid = t[i].get_id();
//cout << "thread id is : " << pid << endl;
}
// 等待线程完成
for (int i = 0; i < nt; i++) {
t[i].join();
}
return 0;
}
参考:C++11多线程编程(三)——lock_guard和unique_lock - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/340348726