多线程

  1. c++ 使用线程注意事项
  2. c++11院子操作(atomic operation)
  3. 引用

c++ 使用线程注意事项

  1. 限定符避免编译器优化
    参考限定符部分,不过没用好像也没什么问题

     // 线程操作对象需要增加volatile,避免编译器优化(直接从变量地址读取而不是上次的值)
     volatile int val;
    
  2. 锁同一个对象需要同一个锁,如全局变量或类对象

     std::mutex mut  
     //构造函数加锁,析构函数解锁,避免程序意外终止结果没来得及解锁
     lock_guard<mutex> lock (mut);  
    
  3. sleep_for,线程休眠指定时间后唤醒,不过由于线程调度等原因,实际睡眠时间可能更长

     std::this_thread::sleep_for( std::chrono::milliseconds(2000) );        
    
  4. 线程销毁
    • thread::join()调用后,调用它的线程会被block,直到线程的执行被完成.如果一个c++线程对象销毁时还可以join就会抛出异常
    • thread::detach()函数被调用后,执行的线程从线程对象中被分离,已不再被一个线程对象所表达—这是两个独立的事情.
    • 执行到析构函数时要么join,要么detach线程

c++11院子操作(atomic operation)

所谓的原子操作,取的就是“原子是最小的、不可分割的最小个体”的意义.确保同一时刻只有唯一的线程对指定的全局资源进行访问,
类似互斥锁,但是原子操作更加接近底层,因而效率更高.

使用非常简单,只是类型不一样,且不用加锁就能保证线程访问的安全性,类型包括atomic_bool,atomic_int等常用简单类型

#include <atomic>      

atomic_long total(0);
total++;

引用

  1. C++11:多线程与锁
  2. C++11中std::mutex的使用
  3. thread中join和detach的区别
  4. C++11中的原子操作(atomic operation)

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 yangbenbo@whu.edu.cn

文章标题:多线程

本文作者:杨本泊

发布时间:2020-11-14, 21:07:02

最后更新:2023-07-09, 07:10:12

原始链接:http://yangbenbo.github.io/2020/11/14/多线程/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录