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

住房城乡建设局网站首页/企业网站推广优化公司

住房城乡建设局网站首页,企业网站推广优化公司,东莞市做网站,wordpress设置了固定连接打不开我们习惯性的使用互斥锁来保护某个临界区,它可能是一个变量,或者一段代码,比如在进入某个函数后,需要对mutex加锁,而无论任何情况下,只要函数退出,就要把锁释放掉,而函数可能会因为各…

我们习惯性的使用互斥锁来保护某个临界区,它可能是一个变量,或者一段代码,比如在进入某个函数后,需要对mutex加锁,而无论任何情况下,只要函数退出,就要把锁释放掉,而函数可能会因为各种情况而退出,包括遇到各种异常,错误,不同的结果等等,一个可行的方案是在所有可能退出函数的地方进行锁的释放,亦或者通过goto/break等语法来控制函数在特定的位置退出,并且退出前进行锁的释放,但这些实现方式相比较今天要说的互斥锁包装器来说,没那么优雅,下面看下MySQL是如何使用互斥锁包装器的。

在MySQL中,通过Mutex_lock这个类来实现对mutex锁的简单封装,代码非常简练,只有十几行,如下:

class Mutex_lock
{
public:explicit Mutex_lock(mysql_mutex_t *mutex) : m_mutex(mutex){if (m_mutex)mysql_mutex_lock(m_mutex);}~Mutex_lock(){if (m_mutex)mysql_mutex_unlock(m_mutex);}
private:mysql_mutex_t *m_mutex;Mutex_lock(const Mutex_lock&);                /* Not copyable. */void operator=(const Mutex_lock&);            /* Not assignable. */
};

Mutex_lock类将拷贝构造函数和赋值函数设置为private类型,来避免实例通过这种方式被复制。

Mutex_lock的原理就是在局部变量离开当前作用域时,会被自动析构,而析构函数中调用解锁函数。

MySQL中也有很多地方利用Mutex_lock来实现代码作用域的锁控制,比如

int add_status_vars(const SHOW_VAR *list)
{Mutex_lock lock(status_vars_inited ? &LOCK_status : NULL);try{while (list->name)all_status_vars.push_back(*list++);}catch (std::bad_alloc){my_error(ER_OUTOFMEMORY, MYF(ME_FATALERROR),static_cast<int>(sizeof(Status_var_array::value_type)));return 1;}if (status_vars_inited)std::sort(all_status_vars.begin(), all_status_vars.end(), Show_var_cmp());status_var_array_version++;return 0;
}

或者是:

/**Calculate the timestamp difference for password expiry@param thd			 thread handle@param acl_user		 ACL_USER handle@retval 0  password is valid@retval 1  password has expired
*/
bool
check_password_lifetime(THD *thd, const ACL_USER *acl_user)
{bool password_time_expired= false;if (likely(acl_user != NULL) && !acl_user->password_expired &&acl_user->password_last_changed.time_type != MYSQL_TIMESTAMP_ERROR&& auth_plugin_is_built_in(acl_user->plugin.str)&& (acl_user->use_default_password_lifetime ||acl_user->password_lifetime)){MYSQL_TIME cur_time, password_change_by;Interval interval;thd->set_time();thd->variables.time_zone->gmt_sec_to_TIME(&cur_time,static_cast<my_time_t>(thd->query_start()));password_change_by= acl_user->password_last_changed;memset(&interval, 0, sizeof(interval));if (!acl_user->use_default_password_lifetime)interval.day= acl_user->password_lifetime;else{Mutex_lock lock(&LOCK_default_password_lifetime);interval.day= default_password_lifetime;}if (interval.day){if (!date_add_interval(&password_change_by, INTERVAL_DAY, interval))password_time_expired= my_time_compare(&password_change_by,&cur_time) >=0 ? false: true;else{DBUG_ASSERT(FALSE);/* Make the compiler happy. */}}}DBUG_EXECUTE_IF("force_password_interval_expire",{if (!acl_user->use_default_password_lifetime &&acl_user->password_lifetime)password_time_expired= true;});DBUG_EXECUTE_IF("force_password_interval_expire_for_time_type",{if (acl_user->password_last_changed.time_type !=MYSQL_TIMESTAMP_ERROR)password_time_expired= true;});return password_time_expired;
}
http://www.lbrq.cn/news/734509.html

相关文章:

  • 怎样做网站流量统计/百度推广需要多少钱
  • 企业网站微信公众号的建设事迹/发免费广告电话号码
  • 网站初期建设的成本来源/seo诊断书
  • 做视频解析网站犯法/网页设计与制作
  • 网上免费申请营业执照/seo搜索引擎优化工程师招聘
  • 杭州网站搜索排名/广州商务网站建设
  • 汽车推广方式有哪些/人员优化方案
  • 深圳易捷网站建设/怎么自己开发网站
  • 哈尔滨住房和城乡建设厅官方网站/提高seo排名
  • 要怎么判断网站是什么cms做的/怎么自己做一个网站
  • 深圳做网站多钱/百度一下首页手机版
  • 网站建设的方案/seo搜索引擎优化书籍
  • 怎么自己做公众号/seo排名优化工具推荐
  • wordpress看文/win7系统优化大师
  • 无锡网站建设有限公司/百度应用app
  • 网站建设项目外包网站/推广接单平台哪个好
  • 网站如何做支付接口/销售策略和营销策略
  • 一个网站建设的组成/seo培训学校
  • wordpress无法将上传的文件移动至/深圳高端seo公司助力企业
  • 广安北京网站建设/关于进一步优化
  • wordpress设计的网站/福建企业seo推广
  • 百度如何制作个人网页/win7优化工具
  • wordpress模板网站标题重复/推广软文怎么写样板
  • 做期货网站/企业网络推广计划
  • 旅游网站开发方案百度文库/合肥百度推广公司哪家好
  • 妇科医院网站设计/sem全称
  • 免费试用网站/提高百度搜索排名工具
  • 郑州网站高端网站设计/百度云盘资源共享链接群组链接
  • 做视频网站用什么源码/网站创建流程
  • wordpress 开源/aso优化怎么做
  • Chrome 插件开发实战:从入门到进阶
  • uniapp 自定义组件封装、easycom匹配规则
  • 遥感机器学习入门实战教程|Sklearn案例⑤:集成学习方法全览
  • Docker操作速查表
  • Altium Designer 22使用笔记(8)---PCB电气约束设置
  • Bigemap APP 详细使用教程,入门学习PPT