- 线程库C++11
- 线程Thread
- 头文件
- 常用的成员函数
- 创建线程的方式
- 多线程的冲突问题
- 互斥体Mutex
- 头文件
- 常用的成员函数
- 实例
- 原子操作Atomic
- 头文件
- 实例
- 自动加解锁lock_guard
- 实例
- 同步
- 同步方式
- 实例
在C++ 11引入了对多线程的支持。包括线程、互斥锁、原子操作、自动加减锁和同步。下面就分别介绍一下对应的用法。
线程Thread线程:系统分配cup时间和调度的基本单位
头文件#include
| 函数名 | 作用 |
|---|---|
| get_id() | 获取当前线程ID |
| join() | 等待 |
| detach() | 分离 |
thread t1(函数地址);//无参
thread t2(函数地址,参数1,参数2,…);//有参
A a;
thread t3(&A::output,&a);成员函数,
全局函数实例:
#include#include #include 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
| 函数名 | 作用 |
|---|---|
| lock() | 加锁 |
| unlock() | 解锁 |
#include原子操作Atomic 头文件#include #include #include 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
实例#include自动加解锁lock_guard#include #include 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同步 同步方式#include #include #include #include using namespace std; int a = 0; mutex g_m;//创建锁 void test3() { for (int i = 0; i < 1000000; ++i) { lock_guard 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; }
- 信号量
- 事件
- 消息
- C++11中的条件变量
#include#include #include #include #include #include #include using namespace std; string buffer; mutex m; condition_variable cv; //状态变量 //为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起; void workThread() { //unique_lock比lock_guard灵活很多,效率上差一点,内存占用多一点。 unique_lock 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; }



