c++11知识点简单汇总
1:关键字和语法
auto :可以根据右值,推导出右值的类型,然后左边变量的类型也就也已知了
nullptr:给指针专用(能够和整数进行区别)#define NULL 0
foreach:可以遍历数组,容器等
for(Type val:container)=》底层通过指针和迭代器实现的
{
cout<<val<<" ";
}
右值引用:move移动语义函数和forward类型识别完美转发函数
模板的一个新特性:typename… A 表示可变参(类型参数)
2:绑定器和函数对象
function:函数对象 bind: 绑定器 原来bind1st和bind2nd+二元函数对象=》一元函数对象
lambda表达式
3:智能指针 shared_ptr和weak_ptr
4:容器
STL set和map :红黑树 log(n)复杂度
unordered_set和unordered_map :hash表 O(1)复杂度
arry:数组
forward_list:前向链表
5:c++语言级别支持的多线程编程
thread/mutex/condition_variable
lock_guard/unique_lock
atomic 原子类型 基于CAS操作的原子类型 线程安全
sleep_for
void threadHandle1(int time){
std::this_thread::sleep_for(std::chrono::seconds(time));
cout<<"hello"<<endl}
int main(){
//定义一个线程对象,传入一个线程函数,新线程就开始运行了
std::thread t1(threadHandle1,2);
//主线程等待子线程结束,主线程继续往下运行
t1.join();
//t1.detach();//子线程设置为分离线程
}
6多线程程序
竞态条件:多线程程序执行结果是一致的,不会随着cpu对线程不同的调用顺序而产生不同的运行结果
unique_lock就是删除拷贝构造赋值重载,但是加了右值引用,对临时变量可以拷贝构造赋值重载,相比与scope_ptr; 避免了上锁以后return然后就会没有释放锁,智能指针自动释放不存在这样的问题
7.线程间的同步通信机制
1、线程间的互斥:竞态条件=》临界区代码段=》互斥锁mutex 轻量级的无所实现CAS
strace ./a.out mutex=>pthread_mutex_t
2、线程间的同步通信
生产者,消费者线程模型,不仅可以使用在简单的临界区代码段的互斥操作中,而且还能用在函数调用的过程中
std::mutex mtx;//定义互斥锁,做线程间的互斥操作
std::condition_variable cv;
class Queue
{
public:
void put(int val){
unique_lock<std::mutex>lck(mtx);
while(!que.empty()){
//生产者线程应该进行等待状态,并且把mtx互斥锁释放掉
cv.wait(lck); //通知以后 等待=》阻塞=》其他释放lock以后变成可执行状态
}
que.push(val);
通知其它所有线程,生产了物品可以消费
cv.notify_all();//其他线程得到通知就会 等待状态=》阻塞状态
cout<<"生产者生产:"<<val<<"号物品"<<endl;
}
void get(){
unique_lock<std::mutex>lck(mtx);
while(que.empty()){
//unique_lock<std::mutex>lck(mtx);
cv.wait(lck);
}
int val=que.front();
que.pop();
cv.notify_all();//其他线程得到通知就会 等待状态=》阻塞状态
cout<<"消费者消费:"<<val<<"号物品"<<endl;
return val;
}
private:
queue<int>que;
}
unique_lock<std::mutex>lck(mtx);
cv.wait(lck);
#1 使线程进入等待状态 #2 lck.unlock可以把mtx给释放掉
//通知cv上等待的线程,收到通知,从等待状态=》阻塞状态=》互斥锁=》线程继续往下执行
cv.notify_all();
基于CAS操作的atomic原子类型
无锁队列=》CAS来实现
std::this_thread::yield();//线程让出当前的cpu时间片,等待下一次调度
volatile 多线程对共享变量不用缓存,看内存里面的值,不是线程缓存的,
其他线程可以马上看到,防止一些意外的错误。