首页 > 作文

【并发编程】多线程程序同步策略

更新时间:2023-04-07 12:44:24 阅读: 评论:0

目录

c++11线程使用初探

c++11线程使用初探

std::thread

#include <thread>

只读的共享数据在多个线程间不存在race condition的危险,而可读可写共享数据在线程间共享时则需做好线程同步,即数据保护,主要包括lock-bad和lock-free策略。

常见的以互斥锁保护多线程间的共享数据,保证某一时刻仅有一个线程访问共享数据,导致线程间数据保护是串行,因此在多线佛山瓷砖十大名牌程环境中,锁保护的区域越小,并发程度越高。

采用条件变量等待某个事件或条件发生

c++11提供了两种条件变量:std::condition_variable和std::condition_variable_any,均需要和互斥量一起使用来保证操作的同步性。前者英语试卷家长评语仅能与std::mutex一起使用,后者可与所有mutex-like武大华科的锁一起使用,更加通用,但以牺牲空间、性能或操作系统资源为代价,因此std::condition_variable是首选;它们均在 头文件中定义。

生产者-消费者模式在并发编程中应用广泛,手扶梯有助于系统的解耦。队列是一种常见的在生产者和消费者线程间传递数据的容器,队列先入先出的特性满足应用对顺序性的要求。

人脸分析组件采用队列传递数据,通过在生产者线程中调用inputdata函数将待分析数据包送入队列,并调用notify_one通知消费者线程,从而消费者线程进行人脸数据分析。伪代码如下:

std::mutex mut;std::condition_variable cond;std::queue<data_chunk> data_queue;// 将待分析数据送入队列int inputdata(const data_chunk& data){  if (invalid_data)  {    log_error("invalid param!");    return error_code;  }  // 将数据送入队列  // 并发出通知  std::lock_guard<std::mutex> lk(mut);  data_queue.push(data);  cond.notify_one();  return success_code;}// inputdata在生产者线程中被调用,将待分析数据送入队列// 消费线程函数process从队列取数据以进行分析// 线程在条件未发生时因wait函数阻塞进入睡眠状态void process(){  while (not_exit_expression)  {    // 使用unique_lock而非lock_guard    std::unique_lock<std::mutex> lk(mut);    // wait函数在条件满足时返回,否则线程进党员大会主持词入阻塞状态    //    // 若lambda表达式返回fal(即不条件满足),则wait释放lk中锁资源,    // 且线程进入阻塞状态,以便生线程可以继续获取锁并送数据到队里;否则,    //    // 当notify_one通知条件变量时,消费消除从睡眠状态苏醒,重新获取锁,且对条件再次检查,lambda表达式返回true    // 此时,wait返回并继续持有锁资源,然后继续往下执行    cond.wait(lk, [](){ return !data_queue.empty(); });    data_chunk data = data_queue.front();    data_queue.pop();    // wait返回后持有锁,因此需要在此处解锁    lk.unlock();    // 处理数据    process_the_data;  }}

本文发布于:2023-04-07 12:44:23,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/a744f91f24280de6277522b8a07ee0eb.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:【并发编程】多线程程序同步策略.doc

本文 PDF 下载地址:【并发编程】多线程程序同步策略.pdf

标签:线程   数据   队列   条件
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图