在C++ 11引入了对多线程的支持。包括线程、互斥锁、原子操作、自动加减锁和同步。下面就分别介绍一下对应的用法。
线程:系统分配cup时间和调度的基本单位
#include<thread>
函数名 | 作用 |
---|---|
get_id() | 获取当前线程ID |
join() | 等待 |
detach() | 分离 |
thread t1(函数地址);//无参
thread t2(函数地址,参数1,参数2,…);//有参
A a;
thread t3(&A::output,&a);成员函数,
全局函数实例:
#include <thread>
#include <string>
#include <iostream>
using namespace std;
void test1(string name)//子线程 有参
{
for (int i = 0; i < 100; ++i)
{
cout << name << " test1:" << i << endl;
}
}
void test2()//子线程
{
for (int i = 0; i < 100; ++i)
{
cout << "test2:" << i << endl;
}
}
int main()
{
thread t1(test1, "线程1");//创建线程 并启动线程
thread t2(test2);
t1.join();//等待线程执行结束,不写会造成程序崩溃
t2.join();
return 0;
}
成员函数实例:
class A
{
public:
void output(string name)
{
cout << "线程执行 " << name << endl;
}
};
int main()
{
A a;
//格式:thread t1(函数地址 对象地址 参数1 参数2...)
thread t1(&A::output, &a, "线程一");//成员函数做线程
t1.join();
return 0;
}
a. 出现了更高等级的指令
b. 该线程的时间片到了
#include<mutex>
函数名 | 作用 |
---|---|
lock() | 加锁 |
unlock() | 解锁 |
#include <thread>
#include <string>
#include <iostream>
#include <mutex>
using namespace std;
int g_a = 0;
mutex g_m;//创建锁
void test3()
{
for (int i = 0; i < 1000000; ++i)
{
//保证数据的完整性
g_m.lock();//加锁
g_a += 1;
g_m.unlock();//解锁
}
}
int main()
{
thread t1(test3);
thread t2(test3);
thread t3(test3);
t1.join();
t2.join();
t3.join();
cout << g_a << endl;
return 0;
}
#include<atomic>
#include <thread>
#include <iostream>
#include <atomic>
using namespace std;
atomic_int a;//将这个变量设置为int原子级别
void test3()
{
for (int i = 0; i < 1000000; ++i)
{
++a;//在执行过程中,等同于锁
}
}
int main()
{
thread t1(test3);
thread t2(test3);
thread t3(test3);
t1.join();
t2.join();
t3.join();
cout << a << endl;
return 0;
}
在创建时调用构造函数自动加锁,出了作用域就调用析构函数解锁。
#include <thread>
#include <string>
#include <iostream>
#include <mutex>
#include <atomic>
using namespace std;
int a = 0;
mutex g_m;//创建锁
void test3()
{
for (int i = 0; i < 1000000; ++i)
{
lock_guard<mutex> la(g_m);//自动加锁 自动释放
++a;
cout << a << endl;
}
}
int main()
{
thread t1(test3);
thread t2(test3);
thread t3(test3);
t1.join();
t2.join();
t3.join();
cout << a << endl;
return 0;
}
#include <thread>
#include <string>
#include <iostream>
#include <mutex>
#include <atomic>
#include <string>
#include <condition_variable>
using namespace std;
string buffer;
mutex m;
condition_variable cv; //状态变量
//为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起;
void workThread()
{
//unique_lock比lock_guard灵活很多,效率上差一点,内存占用多一点。
unique_lock<mutex> lk(m);
cv.wait(lk);//等待信号
cout << "收到数据:" << buffer << endl;
}
int main()
{
thread t1(workThread);
string name;
cin >> name;
buffer = name;
cv.notify_all();//发出通知
t1.join();
cout << "数据处理完成" << endl;
return 0;
}