zoukankan      html  css  js  c++  java
  • C++ 之 并发编程基础

    C++并发编程基础

    在C++线程库中提供一个native_handle()成员函数,允许通过使用平台相关API直接操作底层实现。

    为了并发地运行函数,需要使用特定的函数以及对象来管理各个线程。C++在头文件中提供了管理线程的类和函数

    一个简单的Hello, Concurrent World程序:

    #include <iostream>
    #include <thread>  //①
    void hello()  //②
    {
      std::cout << "Hello Concurrent World
    ";
    }
    int main()
    {
      std::thread t(hello);  //③
      t.join();  //④
    }
    

    其中 调用方法std::thread ,可见仍属于std域;同时使用join函数是为了保证t线程执行完毕后main主线程才结束。

    启动线程

    线程在线程对象创建时启动,即构造线程std::thread对象时便会启动。也就是说我们需要进行共享变量的设置才可以实现线程之间的相互控制。

    • 三种构建方法:
    std::thread my_thread(background_task);		// 1
    std::thread my_thread((background_task())); // 2
    std::thread my_thread{background_task()};   // 3
    
    • 启动线程之后,需要明确是要等待线程结束(加入式),还是让其自主运行(分离式)
    t.detach(); //(分离式),new和current线程无关
    t.join();	//(加入式),阻塞current线程,执行新线程
    
    • 线程间的变量修改则需要使用std::ref()将数据转换为引用数据:
    std::thread t(update_data_for_widget,w,std::ref(data));
    

    数据同步的安全性实现

    std::mutex mt;
    void addmethod(int a)
    {
        mt.lock();
        addprocessing(...);
        mt.unlock();
    }
    void deletemethod(int a)
    {
        mt.lock();
        deleteprocessing(...);
        mt.unlock();
    }
    

    使用unique_lock或者lock_guard实现上锁。

    std::mutex mt;
    void addmethod(int a)
    {
        std::unique_lock<std::mutex> lock(mt);
        addprocessing(...);
    }
    void deletemethod(int a)
    {
        std::unique_lock<std::mutex> l(mt);
        deleteprocessing(...);
    }
    
    任世事无常,勿忘初心
  • 相关阅读:
    WMI系统管理工具介绍和获取机器码
    QListWidget高性能加载图片数据
    2.5偏差方差分解
    QT图片旋转动画
    Qt实现数字滚动动画效果
    Qt动画使用总结
    线性回归--经验最小化,结构最小化,最大似然估计,最大后验估计
    获取国家2019年最新的省、市、区/县、街道、小区/居委会信息 包括港澳台
    .net 利用Emit将object转为DbParameter,DataTable转为List<>
    c#简单操作MongoDB_2.4
  • 原文地址:https://www.cnblogs.com/FlameBlog/p/14715406.html
Copyright © 2011-2022 走看看