当前位置: 首页 > news >正文

电子商务网站建设与维护的主要内容品牌营销策划岗位职责

电子商务网站建设与维护的主要内容,品牌营销策划岗位职责,简单大气的网站模板,网站底部怎么做多线程同步 引言总述详情互斥锁示例运行结果分析条件变量示例一实现分析优化运行结果示例二实现代码运行结果示例三实现代码运行结果读写锁示例实现代码注意分析运行结果附言实现运行结果运行结果个人心得引言 项目中使用多线程,会遇到两种问题,一种是对共享资源的访问时需要…

多线程同步

  • 引言
  • 总述
  • 详情
    • 互斥锁
      • 示例
      • 运行结果
      • 分析
    • 条件变量
      • 示例一
        • 实现
        • 分析
        • 优化
        • 运行结果
      • 示例二
        • 实现代码
        • 运行结果
      • 示例三
        • 实现代码
        • 运行结果
    • 读写锁
      • 示例
        • 实现代码
        • 注意
        • 分析
        • 运行结果
      • 附言
        • 实现
        • 运行结果
        • 运行结果
        • 个人心得

引言

项目中使用多线程,会遇到两种问题,一种是对共享资源的访问时需要考虑多线程竞争访问导致的不是预期的结果,另一种是多线程之间需要同步的问题。其实质归根结底就是多线程之间的同步。
本文主要在C++11的基础之上,结合示例讲述多线程同步的几种方法。
本文为上篇。

总述

C++中多线程同步的方式分为:
互斥锁,条件变量,读写锁,信号量,future和promise,原子操作,线程局部存储

详情

下面根据上面提到的七种线程同步的方式分别给出示例。

互斥锁

互斥锁用于解决多线程间对共享资源的竞争问题,具有排它性。一旦一个线程获取锁,并加锁,其他的线程只能阻塞等待该线程解锁之后再抢占锁,且每次只能有一个线程获得锁,没有获得锁的线程只能阻塞等待。

示例

下面是互斥锁的示例:

#include <iostream>
#include <thread>
#include <mutex>using namespace std;
mutex g_mutex;void fun(int n,const char& c) {g_mutex.lock();cout << "子线程的线程id:" <<this_thread::get_id()<<"开始执行该线程......"<< endl;for (int i = 0; i < n;++i) {cout << c;}cout << endl;cout << this_thread::get_id()<<"子线程结束" << endl;g_mutex.unlock();
}int main()
{thread t1(fun,5,'S');thread t2(fun,6,'*');t1.join();t2.join();cout << "主线程的id:" << this_thread::get_id() << endl;return 0;
}

运行结果

在这里插入图片描述

分析

上面的示例创建了两个子线程,执行相同的线程处理函数,这就涉及到多线程对共享资源的竞争问题,这里两个子线程都抢着调用线程处理函数fun。由于何时加锁,在哪里加锁,需要结合开发人员的实际需求而定。这个示例希望程序能够输出完整的一个子线程调用fun函数后的内容,所以在刚进入线程处理函数和离开线程处理函数的时候进行加锁和解锁。

若是希望只给fun函数中的循环打印部分加锁,可以这样修改(只修改线程处理函数fun加锁,解锁位置,其它不变):

void fun(int n,const char& c) {cout << "子线程的线程id:" <<this_thread::get_id()<<"开始执行该线程......"<< endl;g_mutex.lock();for (int i = 0; i < n;++i) {cout << c;}g_mutex.unlock();cout << endl;cout << this_thread::get_id()<<"子线程结束" << endl;
}

执行的结果:
在这里插入图片描述
可以看到上面的示例,变动了加锁和解锁的位置之后,很明显的出现了资源竞争,输出后结果出现了混乱。当然输出结果也会出现很多种,无法确定。像下面这样,是再次运行被修改加锁和解锁的位置之后的运行结果。
在这里插入图片描述
也可能是这样的运行结果:
在这里插入图片描述
对于加锁的部分,当前获取锁的子线程可以保证其连续执行,但是不加锁的部分就会出现资源竞争抢占,最终两个子线程的同一个线程处理函数fun中不加锁的内容会穿插着输出,达不到想要的效果。

条件变量

条件变量需要与互斥锁搭配使用来达到想要的效果。

示例一

实现

下面是实现代码:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>using namespace std;
mutex g_mutex;
condition_variable g_cond;
bool IsReady = false;
const int g_num = 10;void fun(int n) {unique_lock<mutex> lock(g_mutex);while (!IsReady) {cout << "线程被阻塞....." << endl;g_cond.wait(lock);}cout << "线程" <<this_thread::get_id()<<"执行完成!"<< endl;
}void wakeUp() {this_thread::sleep_for(chrono::milliseconds(2));//延迟2毫秒,为了让子线程出现阻塞等待的过程unique_lock<mutex> lock(g_mutex);IsReady = true;cout <<
http://www.yayakq.cn/news/986877/

相关文章:

  • 珠海市建设工程质量监督检测站网站组建团队建设网站与开发需要多少钱
  • 枣庄网络推广公司南宁软件优化网站建设
  • php建站模板手机网站建设的费用
  • 网站建设费用计算应用中心安装
  • apache网站开启gzip哈尔滨网站建设公司
  • 教育网站模板下载千万别学计算机应用技术
  • 两个域名 两个网站 如何推广对网站开发的理解500字
  • 免费建站软件宜昌市建设局网站
  • 网站导航固定代码网站后台html模板下载
  • 学校网站欣赏中文wordpress 手机网站支付
  • 公司网站备案资料江门市网站开发
  • 泰州cms建站模板sae部署wordpress
  • 建立网站的优势洛阳建站公司
  • 平度市城乡建设局网站网络营销流程是什么
  • 周宁县建设局网站广州网站设计建设公司
  • 做网站首页的图片素材电子商务网站开发模块流程图
  • 电子商务网站建设思维导图公司禁用网站怎么做
  • 静安集团网站建设上海大型网站建设公司排名
  • 商家产品展示网站源码舟山集团网站建设
  • 做英剧网站的设计思路极速网站建设定制价格
  • 要制作自己的网站需要什么材料怎么自己创建微信小程序
  • 黄冈智能网站建设平台wordpress显示选项
  • 北京企业网站定制上海浦东医院网站建设
  • 长沙城乡建设部网站首页株洲网站建设哪家好
  • 网站开发工作 岗位怎么称呼网络服务器配置与管理试题
  • 湖北省住房和建设厅官方网站查询网站的注册信息
  • 软件实施工程师工资一般多少石家庄百度推广优化排名
  • 青海西宁制作网站专业哪些平台可以发布推广信息
  • 怎么做公司的中英文网站网站前后台代码
  • 怎么查网站是谁建的网站色哦优化8888