
C++11
土戈
软件开发
展开
-
STL线程库简介
在std::thread库中,一个线程用的是一个thread对象表示,当创建一个thread对象时即创建一个线程,一个简单的示例如下:#include<iostream>#include<thread>usingnamespacestd;voidthread_entry(constchar*arg){cout <<"thread "<<this_thread::get_id...转载 2020-12-29 10:35:13 · 303 阅读 · 0 评论 -
C++原子性实现无锁队列(待完善)
关于CAS等原子操作CAS操作——Compare & Set,或是 Compare & Swap,现在几乎所有的CPU指令都支持CAS的原子操作。有了这个原子操作,就可以实现各种无锁(lock free)的数据结构。与CAS相似的还有下面的原子操作:(这些东西大家自己看Wikipedia吧)Fetch And Add,一般用来对变量做 +1 的原子操作Test-and-...转载 2018-11-02 08:21:03 · 1081 阅读 · 0 评论 -
C++11实现模板化(通用化)RAII机制
什么是RAII?RAII(Resource Acquisition Is Initialization),“资源获取即初始化”,是C++语言的一种避免泄漏的机制。 RAII的例子以下是C++11头文件<mutex>中的lock_guard的源代码,看代码注释就清楚了,这是典型的RAII风格。 template<typename _Mutex>class ...转载 2018-11-21 08:12:54 · 599 阅读 · 0 评论 -
C++读写锁(stl,boost)
STL 和 Boost 都提供了 shared_mutex 来解决「读-写」问题。shared_mutex 这个名字并不十分贴切,不如 pthread 直呼「读写锁」。shared_mutex 比一般的 mutex 多了函数 lock_shared() / unlock_shared(),允许多个(读者)线程同时加锁、解锁,而 shared_lock 则相当于共享版的 lock_guard。...转载 2018-11-19 08:44:49 · 2860 阅读 · 0 评论 -
一个读写锁的实现与使用(写优先,C++实现)
参考网上资料,实现了一个读写锁,写优先。使用起来也很简单。使用://先定义一个全局锁对象tg_rwlock g_rwlock;void test(){ { tg_rwlock::read_guard(g_rwlock); //读.......... } { tg_rwlock::write_guard(g...原创 2018-11-19 11:20:10 · 3040 阅读 · 1 评论 -
递归锁的实现与使用
实现:#ifndef TG_RECURSIVE_LOCK_H#define TG_RECURSIVE_LOCK_H#include<thread>#include<mutex>class tg_recursive_lock{public: tg_recursive_lock():_count(0) { } ~tg_re...原创 2018-11-24 23:59:12 · 1677 阅读 · 0 评论 -
正则表达式法则及C++11使用正则表达式库regex
C++11 正则表达式库比boost的方便.搞Java 的一定觉得很搞笑,这都是Java的标配功能, 怎么C++11才支持这个库,vs2010 以才支持.参考std::regex_replace std::regex_iterator Regular Expressions (C++)正则的语法真的很多,向前向后,分组…看参考吧,一般不需要全部学会就够用了.#include "st...转载 2011-11-15 19:25:16 · 506 阅读 · 0 评论 -
C++11的原子操作atomic
atomic类禁用了拷贝构造函数,原因是原子读和原子写是2个独立原子操作,无法保证2个独立的操作加在一起仍然保证原子性。这些类中,最简单的是atomic_flag(其实和atomic<bool>相似),它只有test_and_set()和clear()方法。其中,test_and_set会检查变量的值是否为false,如果为false则把值改为true。 除了ato...原创 2018-11-03 16:26:37 · 2227 阅读 · 0 评论 -
C++11中std::array的使用
定义于头文件 <array>template < class T, std::size_t N > struct array;一种特殊情况是 array ( N == 0 )。该情况下, array.begin() == array.end() ,并拥有某个唯一值。在零长 array 上调用 front() 或 back() 的效应是未定义的。简单来说,st...转载 2018-10-28 09:52:36 · 4545 阅读 · 0 评论 -
C++11并发学习(线程总结)
1.与C++11多线程相关的头文件<atomic> ,<thread>,<mutex>,<condition_variable>和<future>。<atomic>:主要声明了两个类, std::atomic和std::atomic_flag,另外还声明了一套C风格的原子类型和与C兼容的原子操作的函数。<thre...转载 2018-10-15 10:49:50 · 331 阅读 · 0 评论 -
比起基于线程编程,更偏爱基于任务编程
如果你想异步地运行函数doAsyncWork,有两个选择。基于线程(thread-based),基于任务(task-based):auto fut = std::async(doAsyncWork); // "fut"的意思是"future"在这种调用中,传递给std::async的函数对象被认为是一个任务(task)。基于任务通常优于基于线程,在这里,doAsyncWork会...转载 2018-10-15 14:40:48 · 188 阅读 · 0 评论 -
C++11并发学习之六:一个简洁牛逼的线程池(有返回值)
为什么要使用线程池? 大多数网络服务器,包括Web服务器、Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短。 传统多线程方案是“即时创建,即时销毁”的策略。线程分为三个过程:T1、T2、T3。T1:线程创建时间T2:线程执行时间,包括线程的同步等时间T3:线程销毁时间 线程本身的开销所...转载 2018-10-29 09:28:58 · 1949 阅读 · 1 评论 -
c++11新特性总结
1.2、constexpr:近似const, 可以修饰变量,也可以修饰函数const int global = 100;int main () { int temp = 100; constexpr int a = 1; //right constexpr int b = global; //right constexpr int c = temp; ...转载 2018-10-29 09:28:26 · 570 阅读 · 0 评论 -
理解std::move和std::forward
std::movec++11中提供了std::move()来将左值转换为右值引用,从而方便的使用移动语义。move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存拷贝。c++中所有容器都实现了move语义,方便我们实现性能优化。move对于拥有形如对内存、文件句柄等资源的成员的对象有效。如果是一些基本类型,比如int或char[10]数组等,如果使用m...转载 2018-10-29 09:29:31 · 15553 阅读 · 1 评论 -
C++11:使用 auto/decltype/result_of使代码可读易维护
C++11 终于加入了自动类型推导。C++引入自动的类型推导,并不是在向动态语言靠拢(强类型语言又称静态类型语言,是指需要进行变量/对象类型声明的语言,一般情况下需要编译执行。例如C/C++/Java;弱类型语言又称动态类型语言,是指不需要进行变量/对象类型声明的语言,一般情况下不需要编译(但也有编译型的)。例如PHP/ASP/Ruby/Python/Perl/ABAP/SQL/JavaScr...转载 2018-10-29 09:29:59 · 725 阅读 · 0 评论 -
比起直接使用new,更偏爱使用std::make_unique和std::make_shared
std::make_shared是C++11的一部分,std::make_unique不是,它在C++14才纳入标准库。如果你使用的是C++11,不用忧伤,因为std::make_unique的简单版本很容易写出来:template<typename T, typename... Ts>std::unique_ptr<T> make_unique(Ts&&a...转载 2018-10-26 09:15:56 · 13958 阅读 · 0 评论 -
C++11中std::tuple的使用
std::tuple是类似pair的模板。每个pair的成员类型都不相同,但每个pair都恰好有两个成员。std::tuple:成员类型不同,有任意数量的成员。当我们创建一个std::tuple对象时,可以使用tuple的默认构造函数,它会对每个成员进行值初始化;也可以为每个成员提供一个初始值,此时的构造函数是explicit的,因此必须使用直接初始化方法。类似make_pair函数,标准...转载 2018-10-26 15:08:05 · 5781 阅读 · 0 评论 -
C++11新特性之十一:emplace
emplace操作是C++11新特性,新引入的的三个成员emplace_front、emplace 和 emplace_back。这些操作构造而不是拷贝元素到容器中,这些操作分别对应push_front、insert 和push_back,允许我们将元素放在容器头部、一个指定的位置和容器尾部。两者的区别 当调用insert时,是将对象传递给insert,对象被拷贝到容器中,而当我们使用emp...转载 2018-10-26 16:00:26 · 29401 阅读 · 0 评论 -
C++11的重大改变
C++11支持lambda表达式,自动类型推断,统一的初始化语法,委托构造函数,删除和默认函数声明,nullptr,以及最重要的右值引用——一种预言将会改变创造和处理对象方式的技术。C++11标准库同样增加了新的算法,新的容器类,原子运算,类型特性,正则表达式,新的智能指针,async()功能以及多线程库。自动类型推断auto和decltypeauto c = 'a'; // char...转载 2018-10-15 09:53:30 · 468 阅读 · 0 评论