智能指针,与引用计数相关
auto_ptr: 主要为异常安全设计的,在程序正常退出或者异常终止,会调用类的析构函数,释放资源。
复制\赋值是损坏性的操作,所以不能绑定到数组或者变量指针,也不能将auto_ptr对象存储在容器中。
auto_ptr a(new int(10));
auto_ptr b;
b.reset(new int(5));
a = b;
//先解除a绑定的对象
//将a指向b
//b最后为未绑定状态
if (a.get()) //来判断是否初始化auto_ptr实例
shared_ptr:
构造函数
std::shared_ptr<int>p5 (new int, [](int* p){delete p;}, std::allocator<int>());
可以指定deleter
visitor设计模式
不同的操作,使用同一接口访问、调用
visitor模式实现了不改变类本身,却改变类的行为的功能
想要分别处理各种不同类型的数据, Boost.Variant 为我们提供了一个名为 boost::apply_visitor() 的函数。
#include
#include
#include
#include
#include
std::vectorvector;
structoutput :
public boost::static_visitor<>
{
void operator()(double &d) const
{
vector.push_back(d);
}
void operator()(char &c) const
{
vector.push_back(c);
}
void operator()(std::string &s) const
{
vector.push_back(s);
}
};
intmain()
{
boost::variant v;
v = 3.14;
boost::apply_visitor(output(), v);
v = 'A';
boost::apply_visitor(output(), v);
v = "Hello, world!";
boost::apply_visitor(output(), v);
}
可以做如下优化
#include
#include
#include
#include
#include
std::vectorvector;
structoutput :
public boost::static_visitor<>
{
template
void operator()(T &t) const
{
vector.push_back(t);
}
};
intmain()
{
boost::variant v;
v =3.14;
boost::apply_visitor(output(), v);
v = 'A';
boost::apply_visitor(output(), v);
v = "Hello, world!";
boost::apply_visitor(output(), v);
}
boost statechart是boost的状态机库, Boost状态机库是一个应用程序框架,你可以用它将UML状态图快速的转换为可执行的c++代码,而不需要任何的代码生成器。它支持几乎所有的UML特征,可以直接了当的转换,并且转换后的c++代码就像对状态机进行一次文本描述一样具体可读性。
http://zh.highscore.de/cpp/boost/multithreading.html
编译链接库
-lboost_thread-mt
类似linux下的thread\mutex\condition实现线程同步
boost::mutexm_pending_ios_mutex;
boost::conditionm_pending_ios_empty;
func()
{
boost::mutex::scoped_locklock(m_pending_ios_mutex);
//do something
m_pending_ios_empty.timed_wait(lock,boost::posix_time::seconds(1));
}
或者
#include
#include
#include
boost::mutex io_mutex;
void count() // worker function
{
for (int i = 0;i < 10; ++i)
{
boost::mutex::scoped_lock lock(io_mutex);
std::cout << i << std::endl;
}
}
int main(int argc, char* argv[])
{
boost::thread thrd1(&count);
boost::thread thrd2(&count);
thrd1.join();
thrd2.join();
return 0;
}
Mutex和lock
1. typedef boost::unique_lock ReadLock;
2. typdef boost::shared_lock WriteLock;
boost::unique_lock表示独占锁
boost::shared_lock表示共享锁(可以多读)
使用boost::shared_mutex构造读写锁时需要使用到boost中的lock帮助类系列
线程在中断点,可以从外部中断
在一个线程对象上调用 interrupt()
会中断相应的线程。 在这方面,中断意味着一个类型为 boost::thread_interrupted
的异常,它会在这个线程中抛出。 然后这只有在线程达到中断点时才会发生。
timed_join 等待一段时间后停止线程
boost::system_time
boost::get_system_time() 获取系统当前时间
boost::posix_time::microseconds() 换算为指定的时间段
boost::posix_time::ptime则用于定义一个位置无关的时间
boost::posix_time::neg_infin
boost::this_thread::sleep()
侵入式指针
http://www.hongquan.me/?p=144
相比标准库std::list(非侵入式指针)
两者的主要区别:
std::list的用户数据并不拥有其在链表中的位置信息
为了删除这个数据,你必须要首先找到这个数据在std::list中的位置,然后调用list::erase来删除这个用户数据。而查找这个动作的时间复杂度为O(n/2)。
当你需要频繁插入删除数据并且你需要查找才知道数据所在位置的时候,std::list或许并不是一个特别好的选择。
Boost::intrusive::list的优点:
可以通过节点自己,直接删除链表中对应的节点
当然了如果直接使用boost::intrusive::list的erase方法的话,那么和std::list之间没有什么差别。所以我们需要使用auto_unlinkmode.
比较常用的 pseudo-random number generator 是 hellekalek1995(少数几维),mt11213b(可到 350D)和 mt19937(可到 623D)。
随机数生成器:
boost一共提供了17种类型伪随机发生器供使用者选择,它们是:
minstd_rand, rand48, lrand48,ecuyer1988, kreutzer1986, hellekalek1995, mt11213b, mt19937, lagged_fibonacci607, lagged_fibonacci1279, lagged_fibonacci2281, lagged_fibonacci3217,lagged_fibonacci4423, lagged_fibonacci9689, lagged_fibonacci19937,lagged_fibonacci23209, lagged_fibonacci44497
boost random提供了如下的分布函数:
uniform_smallint------ 一个整数集上的离散均匀分布
uniform_int ------一个整数集上的离散均匀分布
uniform_01 ------[0, 1)上的连续均匀分布
uniform_real------ [ min, max)上的连续均匀分布
bernoulli_distribution------ 伯努利分布
geometric_distribution------ 几何分布
triangle_distribution------ 三角分布
exponential_distribution------ 指数分布
normal_distribution------ 正态分布
lognormal_distribution------ 对数正态分布
uniform_on_sphere------ 球面上的均匀分布
生成随机数
typedef boost::mt11213brngen_t;
rngen_t rng;
boost::uniform_int
生成在(min,max)整数集上,以mt11213b为随机数生成器的离散均匀分布
若配置文件中存在相同项会报错
terminate called after throwing an instanceof'boost::exception_detail::clone_impl
what(): /etc/zbkc/zbkc.conf(122):duplicate section name
读取文件read_ini(fn, pt)
写文件 write_ini(fn, pt)
BOOST_FOREACH可以方便的遍历STL容器
#include
vector _v;
BOOST_FOREACH(int32_t value,_v)
{
//这里就可以访问value
}
同时元素还支持引用,const,比如上面代码还可以写成:
vector _v;
BOOST_FOREACH(int32_t& value,_v)
{
//这里就可以修改/访问value
}
如果元素内容是结构体之类,引用可以防止拷贝~~
对于map的访问有一点特殊,因为map的元素是std::pair
std::map _map;
typedef const std::map::value_type const_pair;
BOOST_FOREACH(const_pair& node,_map)
{
//这里就可以访问node的元素
int32_tkey = node.first;
int32_tvalue = node.second;
}
或者
Pair p;
BOOST_FOREACH(p, _map)
{
//do something here
}
Boost::shared_lock 非独占锁,读锁
boost::unique_lock
类型的非独占锁
线程本地存储
boost::thread_specific_ptr
类似done