c++11 知识点汇总
1.c++11常用知识点
// C++11内容总结.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
#include <array> // vector
#include <forward_list> // list
using namespace std;
/*
C++11 标准相关的内容 总结一下
一:关键字和语法
auto:可以根据右值,推导出右值的类型,然后左边变量的类型也就已知了
nullptr:给指针专用(能够和整数进行区别) #define NULL 0
foreach:可以遍历数组,容器等
for(Type val : container) => 底层就是通过指针或者迭代器来实现的
{
cout<<val<<" ";
}
右值引用:move移动语义函数和forward类型完美转发函数
模板的一个新特性:typename... A 表示可变参(类型参数)
二:绑定器和函数对象
function:函数对象
bind:绑定器 bind1st和bind2nd+二元函数对象 =》 一元函数对象
lambda表达式
三:智能指针
shared_ptr和weak_ptr
四:容器
set和map:红黑树 O(lgn)
unordered_set和unordered_map:哈希表 O(1)
array:数组 vector
forward_list:前向链表 list
五:C++语言级别支持的多线程编程
createThread
pthread_create
clone
*/
2.thread写c++程序
#include "pch.h"
#include <iostream>
#include <thread>
using namespace std;
/*
C++语言级别的多线程编程=》代码可以跨平台 windows/linux/mac
thread/mutex/condition_variable
lock_quard/unique_lock
atomic 原子类型 基于CAS操作的原子类型 线程安全的
sleep_for
C++语言层面 thread
windows linux strace ./a.out
| |
createThread pthread_create
线程内容:
一. 怎么创建启动一个线程
std::thread定义一个线程对象,传入线程所需要的线程函数和参数,
线程自动开启
二. 子线程如何结束
子线程函数运行完成,线程就结束了
三. 主线程如何处理子线程
t.join() : 等待t线程结束,当前线程继续往下运行
t.detach() : 把t线程设置为分离线程,主线程结束,整个进程结束,所有子线程都自动结束了!
*/
#if 0
void threadHandle1(int time)
{
// 让子线程睡眠time秒
std::this_thread::sleep_for(std::chrono::seconds(time));
cout << "hello thread1!" << endl;
}
void threadHandle2(int time)
{
// 让子线程睡眠time秒
std::this_thread::sleep_for(std::chrono::seconds(time));
cout << "hello thread2!" << endl;
}
int main()
{
// 创建了一个线程对象,传入一个线程函数,新线程就开始运行了
std::thread t1(threadHandle1, 2);
std::thread t2(threadHandle2, 3);
// 主线程等待子线程结束,主线程继续往下运行
t1.join();
t2.join();
// 把子线程设置为分离线程
//t1.detach();
cout << "main thread done!" << endl;
// 主线程运行完成,查看如果当前进程还有未运行完成的子线程
// 进程就会异常终止
return 0;
}
#endif
3.互斥锁 模拟卖票
#include "pch.h"
#include <iostream>
#include <thread>
#include <mutex>
#include <list>
using namespace std;
#if 0
/*
C++ thread 模拟车站三个窗口卖票的程序
线程间的互斥 =》 互斥锁mutex =》 lock_guard封装mutex
*/
int ticketCount = 100; // 车站有100张车票,由三个窗口一起卖票
std::mutex mtx; // 全局的一把互斥锁
/*
多线程程序
竞态条件:多线程程序执行的结果是一致的,不会随着CPU对线程不同的调用顺序,而产生不同
的运行结果。
*/
// 模拟卖票的线程函数 lock_guard unique_lock
void sellTicket(int index)
{
while (ticketCount > 0) // ticketCount=1 锁+双重判断
{
//mtx.lock();
{
// 保证所有线程都能释放锁,防止死锁问题的发生 scoped_ptr
lock_guard<std::mutex> lock(mtx);
if (ticketCount > 0)
{
// 临界区代码段 =》 原子操作 =》 线程间互斥操作了 =》 mutex
cout << "窗口:" << index << "卖出第:" << ticketCount << "张票!" << endl;
//cout << ticketCount << endl;
ticketCount--;
}
}
//mtx.unlock();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
int main()
{
list<std::thread> tlist;
for (int i = 1; i <= 3; ++i)
{
tlist.push_back(std::thread(sellTicket, i));
}
for (std::thread &t : tlist)
{
t.join();
}
cout << "所有窗口卖票结束!" << endl;
return 0;
}
#endif
4.生产者消费者模型