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

无锡市建设银行总行网站学历提升

无锡市建设银行总行网站,学历提升,燕郊网站建设哪家好,深圳做网站的目录 1--std::unique_lock的使用 1-1--std::adopt_lock参数 1-2--std::try_to_lock参数 1-3--std::defer_lock参数 1-4--互斥量所有权转移 1--std::unique_lock的使用 常用成员函数: ① lock(): 加锁; ② unlock(): 解锁; ③ try_lock()…

目录

1--std::unique_lock的使用

1-1--std::adopt_lock参数

1-2--std::try_to_lock参数

1-3--std::defer_lock参数

1-4--互斥量所有权转移


1--std::unique_lock的使用

常用成员函数:

        ① lock(): 加锁;

        ② unlock(): 解锁;

        ③ try_lock(): 不阻塞地尝试给互斥量加锁,获取锁时返回true,否则返回false;

        ④ release(): 返回所管理 mutex 的对象指针,并释放所有权,即当 std::unique_lock 对象使用 release 时,对象将与 mutex 不再有任何关系;若原来的 mutex 在解除关系前处于 lock() 状态,则std::unique_lock 对象不再负责自动帮 mutex 进行 unlock() 的工作,程序员需负责手动对 mutex 进行unlock() 的操作; 

std::unique_lock<std::mutex> guard1(my_mutex1)
std::mutex *ptr = guard1.release();
...
// 需手动解锁
ptr->unlock();

1-1--std::adopt_lock参数

        与 std::lock_guard 中的 std::adopt_lock 类似,当 mutex 手动进行 lock() 后,std::unique_lock 可以使用 std::adopt_lock 告知不使用构造函数来自动 lock(),而只进行 unlock() 的操作;

        线程使用 std::adopt_lock 时,线程本身必须首先进行 lock() 操作;

// example
my_mutex1.lock();// my_mutex1 手动进行lock()以后,在使用std::unique_lock应添加std::adopt_lock参数
std::unique_lock<std::mutex> guard1(my_mutex1, std::adopt_lock);

1-2--std::try_to_lock参数

        当一个线程使用 std::unique_lock 无法随时获取锁时,可以使用 std::try_to_lock 来尝试获取锁,如果获取成功则执行临界区的内容,如果无法获取锁则可以让线程做其他工作,先不进行临界区的工作;

        线程使用 std::try_to_lock 时,线程本身不能首先进行 lock() 操作;

        在下面的代码实例中,取数据的线程在获取锁后会休息一段时间,此时发数据的线程无法获取锁,只能等待;

        当使用 std::try_to_lock 参数时,发数据的线程会尝试获取锁,如果获取成功了则实行临界区的内容,向消息队列发送数据;如果获取失败,则执行 else 语句的内容,直到获取锁为止;

#include <iostream>
#include <thread>
#include <list>
#include <mutex>class myClass{
public:// 收集数据到消息队列void inMsgRecvQueue(){for(int i = 0; i < 100; i++){std::unique_lock<std::mutex> guard1(my_mutex1, std::try_to_lock);if(guard1.owns_lock()){ // 获取锁,执行临界区std::cout << "Running inMsgRecvQueue(), insert one value: " << i << std::endl; msgRecvqueue.push_back(i); // 消息队列存储消息}else{ // 无法获取锁,执行其他工作std::cout << "Running inMsgRecvQueue(), do other works" << std::endl;}}}// 从消息队列取数据void outMsgRecvQueue(){for(int i = 0; i < 100; i++){if(!msgRecvqueue.empty()){// 获取锁后休息10sstd::unique_lock<std::mutex> guard1(my_mutex1);std::chrono::microseconds dura(20000); // 10000msstd::this_thread::sleep_for(dura);// 取出数据int command = msgRecvqueue.front();msgRecvqueue.pop_front(); }else{std::cout << "Running outMsgRecvQueue(), " "the msgRecvqueue is empty" << std::endl;}}}
private:std::list<int> msgRecvqueue; // 消息队列std::mutex my_mutex1; // 创建互斥量 
};int main(int argc, char *argv[]){myClass sample1;std::thread myInMsgObj(&myClass::inMsgRecvQueue, &sample1); // 收集数据线程std::thread myOutMsgObj(&myClass::outMsgRecvQueue, &sample1); // 取出数据线程myInMsgObj.join();myOutMsgObj.join();return 0;
}

1-3--std::defer_lock参数

       std::unique_lock 使用 std::defer_lock 时,不会对绑定的 mutex 进行 lock(),作用是将mutex 与线程进行绑定,后续根据情况考虑是否手动进行 lock() 操作;          

        线程使用 std::defer_lock 时,线程本身不能首先进行 lock() 操作;

1-4--互斥量所有权转移

        通过 std::move 可以转移 std::unique_lock 对象关于 mutex 的所有权;在下面的代码中,guard2 将拥有 my_mutex1 的所有权,guard1 指向空;

std::unique_lock<std::mutex> guard1(my_mutex1);std::std::unique_lock<std::mutex> guard2(std::move(guard1));

http://www.hkea.cn/news/386050/

相关文章:

  • 设计苹果手机的网站病毒什么时候才能消失
  • 国外做化工产品的网站自媒体发布平台
  • 怎么做资源类网站百度搜索热度排名
  • 大片网站建设seo关键词排名优化评价
  • 网络营销推广课程培训苏州seo门户网
  • 做盗版影视网站如何给公司网站做推广
  • 做网站付费流程郑州seo技术
  • 云南网站开发有哪些实用的网络推广方法
  • 央视新闻最新消息今天什么叫seo
  • 网站建设的意义徐州百度推广
  • 建设网站建设的目标百度云盘资源
  • 个体工商户是否能够做网站在线生成个人网站源码
  • 临沂高端网站建设厦门网站推广费用
  • 网站模版友链交易交易平台
  • 武汉做网站找谁百度导航是哪个国家的
  • wordpress互动游戏黄石seo诊断
  • 网页设计作品下载志鸿优化设计
  • 宾馆网站制作seminar是什么意思
  • 网站建设的进度表爱站查询工具
  • 深圳聘请做网站人员长春刚刚最新消息今天
  • 汽配人网做网站沈阳网站seo公司
  • 网站 短链接怎么做网站建设网站定制
  • 网站开发凭证做什么科目百度推广关键词多少合适
  • 网站正在建设 h5模板新闻热点
  • 龙岗公司网站建设怎么上百度搜索
  • 七米网站建设网站自动推广软件免费
  • 余姚公司做网站跨境电商怎么做
  • 顺义哪有做网站厂家百度快照在哪里找
  • 深圳南山网站建设重庆seo黄智
  • 教育微网站建设我要学电脑哪里有短期培训班