https://github.com/ideal
https://github.com/catchorg/Catch2 写起来也很简单: define CATCH_CONFIG_MAIN include "catch.hpp" unsigned int factorial( unsigned int n ) { return n <= 1 ? n...
https://github.com/catchorg/Catch2 写起来也很简单: #define CATCH_CONFIG_MAIN #include "catch.hpp" unsigned int factorial( unsigned int n ) { return n <...
https://github.com/catchorg/Catch2 写起来也很简单: #define CATCH_CONFIG_MAIN #include "catch.hpp" unsigned int factorial( unsigned int n ) { return n ...
有些时候需要把命令行程序的日志在页面中展示,比如这种场景。通常日志里可能含有进度的展示,比如curl的输出,这种展示依赖于r这种控制字符来起作用。遗憾的是如果直接作为html来输出,r会被当作换行,导致进度变成了无数行,比如这里的样子(虽然可能也不是大问题)。
有时难免需要恢复数据库到之前某个制定时间点(例如由于SQL误操作并且已经commit导致)。在阿里云控制台,RDS有两种恢复方法,一种是覆盖性恢复,可以为理解通过全量备份覆盖当前数据库,只能选取某个全量备份进行操作;一种是通过创建临时库,可以制定近7天内任意时间点。显然,选择后者相对能将影响降到最.
接上篇(https://yq.aliyun.com/articles/59034 ),我们知道了lock的意义。回到之前的多线程加法操作,当然也可以通过pthread提供的互斥锁来保证结果是正确的。那互斥锁本身是如何保证原子性的呢?当然首先获得锁的操作需要是一个指令,而不能用加载-比对-存储这种类.
接上篇(https://yq.aliyun.com/articles/59019),对一个变量进行加法操作,可以是3条指令,也可以是1条指令。区别在于,1条指令属于原子操作,不会被打断,那是不是只要1条指令的形式,多线程之间就不需要加锁了呢?我们先试试看。 #include
一直以为一个简单的i++操作,会变成三条会变指令: 1. 加载内存内容到寄存器 2. 对寄存器进行加法操作 3. 写回内存 然而事实上,add指令的操作对象,可以直接是内存的内容,这里有相关的说明:http://x86.renejeschke.de/html/file_module_x86_
多进程或者多线程的程序,涉及到对共享资源的修改,都需要使用到锁。最常见的情况(也一般是然并卵的情况)是对一个全局变量进行++操作,比如有个全局变量i,如果多个线程同时执行i++,教科书已经提到,是会出问题的。因为i++并不是一个原子操作,汇编之后会是三个操作: movl i(%rip