ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++ 之 并发编程基础

2021-04-28 20:36:52  阅读:141  来源: 互联网

标签:std thread mt lock void 编程 C++ 并发 线程


C++并发编程基础

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

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

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

#include <iostream>
#include <thread>  //①
void hello()  //②
{
  std::cout << "Hello Concurrent World\n";
}
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(...);
}

标签:std,thread,mt,lock,void,编程,C++,并发,线程
来源: https://www.cnblogs.com/FlameBlog/p/14715406.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有