scoped_lock

2024-04-28 00:58
文章标签 scoped lock

本文主要是介绍scoped_lock,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一个由于锁的作用域导致core dump的问题的解决

请看如下代码:

[cpp] view plain copy
  1. void CCommParams::setParams( const char * authUser,   
  2.                         const char * authPsw,  
  3.                         const char * securityLevel,   
  4.                         const char * portNumber)  
  5. {  
  6.     boost::mutex::scoped_lock(m_runtimeMutex);  
  7.     std::string SecLevel = (NULL == securityLevel)? "" : securityLevel;  
  8.     std::string nPort =  (NULL == portNumber)? 0 : atoi(portNumber);  
  9.     std::string AuthUsr = (NULL == authUser)? "" : authUser;  
  10.     std::string AuthPwd = (NULL == authPsw)? "" : authPsw;  
  11.     m_szSecLevel =SecLevel;  
  12.     m_szUsrName = authUser;  
  13.     m_szPwd =authPsw;  
  14.     m_dwPort = nPort;  
  15. }  


问题的提出:
在多线程环境下, 如果又多个线程同时调用以上函数setParams,发现总是core dump.
通过gdb bt发现,问题本质原因是由于多个线程对m_Usr等同时写入,如m_szUsrName = authUser,竞争导致的crash。
可奇怪的是,在写入或赋值前,我们已经加锁了啊!百思不得其解。
 
问题的解决:
通过走读代码,发现了一行可疑点:
boost::mutex::scoped_lock(m_runtimeMutex);
正常情况下,我们都是这样使用:
boost::mutex::scoped_lock Lock(m_runtimeMutex);
即会定义一个临时变量 Lock.
这2者有何不同呢。如果定义了Lock变量,那么它的作用域为整个函数域,即从{开始,到}结束,这样mutex就起到了保护数据同时写入竞争的作用;
那么是否没有Lock变量情况下,scoped_lock的作用域仅仅是到该行的“;”就结束了呢?
为了验证这个想法,我写了如下代码,通过对象何时析构来证实该想法:

[cpp] view plain copy
  1. #include <stdio.h>  
  2. #include <string>  
  3.   
  4. using namespace std;  
  5.   
  6. class my  
  7. {  
  8.  public:  
  9.   my(const std::string & name)  
  10.   {  
  11.    m_name = name;  
  12.    printf("create [%s]\n", m_name.c_str());  
  13.   }  
  14.     
  15.   virtual ~my()  
  16.   {  
  17.    printf("destroy [%s]\n", m_name.c_str());  
  18.   }  
  19.    
  20.  private:  
  21.   std::string m_name;  
  22. };  
  23.   
  24. int main(int argc, char** argv)  
  25. {  
  26.  my("1");  
  27.    
  28.  my tmp("2");  
  29.    
  30.  printf("function end\n");  
  31.  return 0;  


 

果不其然,my("1")这个对象在分号;结束之后就进行了析构,而tmp对象直到main函数结束之后才析构。

boost::lexical_cast,mutex::scoped_lock,bind,function,signal的用法

(2016-08-08 13:12:49)
转载
  

c++数据类型万能转换器boost::lexical_cast .

boost::lexical_cast为数值之间的转换(conversion)提供了一揽子方案,比如:将一个字符串"123"转换成整数123,代码如下:

  1. string s = "123"; 
  2. int a = lexical_cast<<spanclass="datatypes">int>(s); 

这种方法非常简单,笔者强烈建议大家忘掉std诸多的函数,直接使用boost::lexical_cast。如果转换发生了意外,lexical_cast会抛出一个bad_lexical_cast异常,因此程序中需要对其进行捕捉。

mutex::scoped_lock

发现某个函数对共享资源写入前调用的了该函数,但是没发现释放锁的地方,当时就理解为:此锁为智能锁,作l用域应该在函数内,函数调用完毕,锁会自动释放。

两种的区别,很常见的

boost::mutex::scoped_lock(m_runtimeMutex);没有临时变量
定义一个临时变量Lock. boost::mutex::scoped_lockLock(m_runtimeMutex);


这两个有何区别?不仅仅如此,很多场景都是如此。

这2者有何不同呢。如果定义了Lock变量,那么它的作用域为整个函数域,即从{开始,到}结束,这样mutex就起到了保护数据同时写入竞争的作用;
那么是否没有Lock变量情况下,scoped_lock的作用域仅仅是到该行的“;”就结束了呢?

  1. class my    
  2. {    
  3.  public:    
  4.   my(const std::string & name)    
  5.   {    
  6.    m_name = name;    
  7.    printf("create [%s]\n", m_name.c_str());    
  8.   }    
  9.       
  10.   virtual ~my()    
  11.   {    
  12.    printf("destroy [%s]\n", m_name.c_str());    
  13.   }    
  14.      
  15.  private:    
  16.   std::string m_name;    
  17. };    
  18.     
  19. int main(int argc, char** argv)    
  20. {    
  21.  my("1");    
  22.      
  23.  my tmp("2");    
  24.      
  25.  printf("function end\n");    
  26.  return 0;    
  27. }    
  28. 果不其然,my("1")这个对象在分号;结束之后就进行了析构,而tmp对象直到main函数结束之后才析构。
参考链接: http://blog.csdn.net/acs713/article/details/24290659


boost里的bind,function,signal三个组件都是对用函数做参数(其他算法也用函数做参数),对函数的某一项进行操作。

bind主要是对函数参数的作用。

function主要是对函数地址的封装。

signal主要是异步回调。

用函数做参数时

1.普通函数需要传递函数地址。

2.函数对象需要传递一个对象

3.成员函数需要传递对象,指明所调用的成员函数。如果只有对象则符合规则2.

这篇关于scoped_lock的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/941958

相关文章

【硬刚Java并发】JUC基础(六):Lock 同步锁

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的Java并发部分补充。 显示锁 Lock 在 Java 5.0 之前,协调共享对象的访问时可以使用的机制只有 synchronized 和 volatile 。Java 5.0 后增加了一些新的机制,但并不是一种替代内置锁的方法,而是当内置锁不适用时,作为一种可选择的高级功能。 ReentrantLock 实

解决 The sandbox is not sync with the Podfile.lock问题

问题描述: github / sourcetree下载的Demo,很多时候使用到CocoaPods,有的时候因为依赖关系或者版本问题不能编译运行。出现例如The sandbox is not sync with the Podfile.lock问题时候,如下所示 diff: /../Podfile.lock: No such file or directory diff: Manifest.l

【PostgreSQL教程】PostgreSQL 高级篇之 LOCK(锁)

博主介绍:✌全网粉丝20W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可以先关注收藏起来,在工作中、生活上等遇到相关问题都可以给我

在 python3 中使用 multiprocessing,加上锁,却发现锁没用,怎么办?Lock 多进程 多线程 锁 LOCK lock

multiprocessing 是多进程库,而不同进程之间的全局变量是不共享的,所以,这也是为什么当你对 python3 全局变量加上锁的时候会失效。 正确处理方式如下: 使用 multiprocessing.Value 和 multiprocessing.Array 来共享数据,可以使进程池中的所有进程能够正确访问和修改共享数据。 代码如下 import multiprocessing#

java线程 yield,sleep,join,synchronized wait notify notifyAll,ReentrantLock lock condition, 生产者消费者

yield,sleep,join yield,join,sleep,join是Thread中的方法,不需要 在synchronized 代码块中调用,和synchronized 没关系,也不会释放锁。 Thread.sleep(100);Thread.yield();Thread t;t.join(); (1)yield()不一定保证让出cpu yield()只是使当前线程重新回

mysql Deadlock found when trying to get lock; try restarting transaction

一、现场情况 sql:insert into a ...... 数据库隔离级别:read-committed 表a有唯一索引 二、死锁发生的4个必要条件 1、互斥条件(Mutual Exclusion):资源独享 2、占有并等待条件(Hold and Wait):占有资源并等待其他资源 3、非抢占条件(No Preemption):占有的资源不可以被剥夺,只能主动释放 4、循环等待

解决git error: could not lock config file C:/Program Files/Git/mingw64/etc/gitconfig: Permission denie

昨天电脑中毒重装了系统,安装了 git 之后  设置了账户 ,邮箱 在 git clone 的时候报错, 界面如下: 然后重新用户,邮箱, 出现了这个问题,百度了很久也没解决,今天早上想着这个英文的意思 好像是权限不够,然后 我就去提示的这个文件夹下面 给了全部的权限,本人是window10 系统  给的是everyone 所有 之后在  git config --syste

阅读笔记(五)多线程无锁的C++实现《Lock-Free Data Structures》

1. 前言   本文介绍使用C++实现多线程中无锁算法的实现和优化过程。 2. 无锁&CAS   在多线程程序中,加锁是一种必要的手段,由于保证数据操作的正确性(原子性)。但是这也在很多时候带来了性能的极度下降,因为所有共享数据的操作均需要加锁,有些时候会严重影响性能,比如当读键盘或者一些较慢的I/O操作时,锁会延误了其他线程的操作。更糟糕的是,不当操作可能会带来死锁。   首先介绍最经典

Java Lock 中使用 await() 和 signal()实现 wait()/notify()机制

** Java Lock 中使用 await() 和 signal()实现 wait()/notify()机制 ** 案例 import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;

Weblogic启动报:unable to get file lock, will retry …

问题背景描述: 由于先前服务器直接down掉了,所有进程都非正常的进行关闭了,也就导致了下次启动weblogic的时候报了以下错误: <2012-3-2 下午05时08分34秒 CST> <Info> <Management> <BEA-141281> <unable to get file lock, will retry …>  <2012-3-2 下午05时08分44秒 CS