C++的多线程

C++11 新标准中引入了四个头文件来支持多线程编程,他们分别是<atomic> ,<thread>,<mutex>,<condition_variable>和<future>。 <atomic>:该头文主要声明了两个类, std::atomic 和 std::atomic_flag,另外还声明了一套 C 风格的原子类型和与 C 兼容的原子操作的函数。 <thread>:该头文件主要声明了 std::thread 类,另外 std::this_thread 命名空间也在该头文件中。 <mutex>:该头文件主要声明了与互斥量(mutex)相关的类,包括 std::mutex 系列类,std::lock_guard, std::unique_lock, 以及其他的类型和函数。 <condition_variable>:该头文件主要声明了与条件变量相关的类,包括 std::condition_variable 和 std::condition_variable_any。 <future>:该头文件主要声明了 std::promise, std::package_task 两个 Provider 类,以及 std::future 和 std::shared_future 两个 … “C++的多线程”

Read More

C++11之Lambda与bind

Lambda语法和stl::bind 都是语法糖,但不得不说它们的作用很出色: 1. 更方便的定义匿名函数 2. 更简洁的代码逻辑 3. 更安全的私有函数 这称之为closure,即闭包. Lambda 表达式语法有如下五种形式: [capture](parameters) mutable throw() ->return_type {body} [capture](parameters) mutable ->return_type {body} [capture](parameters) ->return_type {body} [capture](parameters) {body} [capture] {body} capture []用于标识一个lambda的开始,其中可以存在零个或多个捕获参数,用逗号分隔.并且只允许以下两种标识符表示: & 引用值 = 拷贝值 对于参数的形式可以有: 1. … “C++11之Lambda与bind”

Read More

C++11之for

C++11中新加了基于范围的for循环,可以对集合/数组/初始化列逐个访问,这种用法在其他高级语言里早有实现,现在C++终于支持了. for的新特性是的代码更加的简洁: //原来的方法 for (std::vector<int>::const_iterator itr = myvec.cbegin(); itr != myvec.cend(); ++itr) //C++11中auto和for新特性结合 for (auto& x : myvec) 简直屌爆了有木有. 对于自定义的集合类型支持foreach,只需实现begin和end函数即可,因为内置的STL模板会自动适配: template <typename Container> auto begin (Container& cont) -> decltype (cont.begin()); template <typename Container> auto begin … “C++11之for”

Read More

C++11之auto与decltype

auto 看介绍,auto实际上是在编译期间就对变量进行了类型推导,所以在程序的实际运行过程中不会对运行效率产生影响.因此可以说auto就类似一个占位符,只不过在编译期间被替换为实际的类型. auto最大的作用应该就是将代码变得简洁,易读.比如在使用迭代器的时候,通常需要写一大串的类型,而此时只需要使用auto即可: for (std::vector<int>::const_iterator itr = myvec.cbegin(); itr != myvec.cend(); ++itr) //使用auto for (auto itr = myvec.cbegin(); itr != myvec.cend(); ++itr) 但是最好不要在接收函数的返回值时使用auto,这会降低代码的可读性: sometype var = func_xxx(var); auto var = func_xxx(var); decltype decltype可以在编译期间确定表达式的类型,比如: int v1; … “C++11之auto与decltype”

Read More

C++11之constexpr

突然发现C++14都要出来了,然而我居然还没仔细的去了解C++11,飘了飘了… 在网上搜了下C++11的相关文章,感觉酷壳的这篇文章介绍的比较好. 然后发现constexpr这个C++11中新出现的关键字介绍比较少,于是就谷歌了一番,做了点总结. constexpr的含义为常量表达式,编译器在编译期间就能求值,因此只能用常量或者常量表达式来初始化.这是一种很强的约束,能保证程序的语义不会受到破坏,并且相比于宏而言,它更安全。 constexpr函数的限制有: 函数必须有返回值. 函数必须存在定义. 函数中仅能有一个return,但允许包含typedef、 using 指令、静态断言等. 只能调用其它constexpr函数或constexpr变量. constexpr函数可以使用递归: constexpr int recursion(int n){ return n > 10 ? recursion( n + 2 ) : 10; } 构造函数的常量表达式限制有: 1. 函数体必须为空 2. 初始化列表只能由常量表达式来赋值 class … “C++11之constexpr”

Read More

fqrouter和Shadowsocks配合使用

使用fqrouter这个安卓应用有段时间了,稳定且功能多,用着感觉非常顺畅,唯一不爽的就是有点耗电. 而且fqrouter是开源的,并且已经Google Play上架,所以这个应用安全有保障. Shadowsocks是个运行在服务端的代理软件,简称是SS,它基于socks5协议,可以配置加密方式,并且比GoAgent要轻量多了.fqrouter支持SS的加密协议,因此可以直接在个人服务器上架设SS. 首先安装pip环境,然后pip install shadowsocks,接着创建编辑config.json文件: { “server”:”0.0.0.0″, “server_port”:1234, “local_port”:1080, “password”:”m”, “timeout”:600, “method”:”table” } 在当前目录下执行nohup ssserver > log &即可运行SS了,加入/etc/rc.local到开机启动:ssserver -c /somepath/config.json > log &. 最后在fqrouter中配置Shadowsocks协议,填入服务器地址/端口/密码/协议,然后就能畅快的上网了.

Read More

理解C#的Event

Event,顾名思义,就是当有事件发生的时候所执行的相关动作. Event通常是配合Delegate使用. using System; namespace dgns { class DelegateTest { public delegate void delegate_dg(); public event delegate_dg delegate_ev; public void start() { Console.WriteLine(“Start Evnet…”); delegate_ev(); Console.ReadKey(); } } class Program { static public void test() … “理解C#的Event”

Read More

理解C#的Delegate

Delegate应该就是对方法的引用,在给定同一参数类型的函数下,可以统一执行所有Delegate集合中的函数. using System; namespace app { class Operation { static int baseNum = 10; public static int Add(int n) { baseNum += n; return baseNum; } public static int Mult(int n) { baseNum *= n; … “理解C#的Delegate”

Read More

理解C#的Reflection

C#中的反射有点偏门,它是一种可以访问、检测和修改程序本身状态或行为的一种能力.在程序的运行期间可以获取Assembly,Module,Class中的相关信息. 反射的优点包括: 提高了程序的灵活性和扩展性. 减少了程序的耦合程度. 方便开发人员的调试. 但是这也是有代价的,因为反射有点类似Java的中间层,它也是一种解释型的操作,因此对于高并发/高性能的程序上,并不推荐使用;并且反射会使得代码逻辑变得更加难以维护. using System; using System.Reflection; public class Info { private string qq; private string phone; private string address; public string QQ { get { return qq; } set { if … “理解C#的Reflection”

Read More

理解C#的Interface

这个C#中的接口在我看来,就像是对C++中纯虚函数的加强一样.接口只包含了成员的声明,成员可以包括属性、方法和事件.而成员的定义则由子类完成.接口只提供了子类应遵循的标准结构. 接口使得实现接口的类或结构在形式上保持一致. 描述一个接口: using system; //如果不加public修饰,则默认情况就是public public interface ITest { void TestMethod(); } class TestImp : ITest { void TestMethod() { Console.WriteLine(“this is imp for ITest”); } } 需要注意的是,接口中的成员不能用public、protected、internal、private等修饰符,因为接口的成员本身就具有public属性.

Read More