c++笔记记录4

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 多线程对共享变量不用缓存,看内存里面的值,不是线程缓存的,
其他线程可以马上看到,防止一些意外的错误。
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值