多线程总结-2020-09-07

头文件
std::mutex
lock()、unlock() 需要在离开函数的地方解锁
std::lock_guard()  实现互斥元RAII  

不要把受保护的数据引用或指针传递到锁的范围之外。
举例:stack> 中进行出栈并复制出栈的值  操作 先复制要出栈的元素,再调用pop()函数删除出栈元素
可能出现的问题:pop函数删除了 但是 元素太大未能复制成功导致失败
解决:1、在pop()传入要引用的对象作为引用 typename s; s.pop(t); 有可能的问题 一些用户定义的类型不支持赋值或者声明类型对象的代价太大
2、堆栈中存储的对象要求不引发异常的拷贝构造函数或移动构造函数
std::is_nothrow_copy_constructible  std::is_nothrow_move_constructible可以在编译时检测不引发异常的拷贝或移动构造函数
3、返回一个指向栈顶元素的指针 推荐使用 std::shared_ptr 避免内存泄露
避免死锁: 多线程中 如果有线程在等你,那你就别等它;
1、避免嵌套锁  
2、在持有锁时,避免调用用户提供的代码
3、以固定顺序获取锁
锁定在恰当的粒度 特别的,在持有锁时,不要做任何耗时的活动,比如文件的I/
类 unique_lock 是通用互斥包装器,允许延迟锁定、锁定的有时限尝试、递归锁定、所有权转移和与条件变量一同使用。unique_lock比lock_guard使用更加灵活,功能更加强大。
使用unique_lock需要付出更多的时间、性能成本。
C++标准库提供了std::once_flag和std::call_once来处理这种情况。使用std::call_once比显示使用互斥元通常会由更低的开销,特别是初始化已经完成的时候,应优先使用。

c++11 提供智能指针来避免内存泄露   在头文件定义
std::shared_ptr  共享指针 可以与其他用户共享某个对象的指针 存在引用次数,当次数为0是 释放指针 
std::unique_ptr  唯一指针,执行某个对象的指针 只能被一个对象所有,当对象析构时 释放指针
std::weak_ptr   临时指针, 需要从shared_ptr指针获取 使用不增加引用次数 

string_view 是C++17所提供的用于处理只读字符串的轻量对象。这里后缀 view 的意思是只读的视图。
通过调用 string_view 构造器可将字符串转换为 string_view 对象。
string 可隐式转换为 string_view。
string_view 是只读的轻量对象,它对所指向的字符串没有所有权。
string_view通常用于函数参数类型,可用来取代 const char* 和 const string&。
string_view 代替 const string&,可以避免不必要的内存分配。
string_view的成员函数即对外接口与 string 相类似,但只包含读取字符串内容的部分。
string_view::substr()的返回值类型是string_view,不产生新的字符串,不会进行内存分配。
string::substr()的返回值类型是string,产生新的字符串,会进行内存分配。
string_view字面量的后缀是 sv。(string字面量的后缀是 s)

查看  进程运行情况 线程数  cat /proc/3775/status    3775是进程id

boost::thread_specific_ptr thread_specific_ptr代表了一个全局的变量,而在每个线程中都各自new一个线程本地的对象交给它进行管理,这样,各个线程就可以各自独立地访问这个全局变量的本地存储版本,线程之间就不会因为访问同一全局对象而引起资源竞争导致性能下降。而线程结束时,这个资源会被自动释放。

你可能感兴趣的:(学习C++之路)