2016年6月20日
今天在使用zookeeper读取策略文件时遇到一个奇怪的问题:
在程序启动时进行zookeeper服务器的连接,从指定节点读取策略文件数据都是ok的,然后创建线程,把zookeeper连接句柄传入,在线程中定 时检查该策略文件是否更新,这时候奇怪的问题出现了:调用zoo_exists函数或者zoo_get函数都无法返回,线程被阻塞了。
经过一系列的猜测和排查(过程就不多说了),原因是:
zookeeper连接句柄是在daemon函数之前创建的,估计在变成后台进程时,某些东西没有复制过去。
2013年7月10日
实现这么一个缓存:
(1)缓存的对象是固定大小
(2)只能从该缓存中分配内存
(3)释放内存要回到缓存中
(4)读写缓存中的数据符合FIFO规则
用途:
(1)接受固定大小的数据块,然后写入缓存中,工作线程从缓存中读取数据块进行处理.
代码:
/**
* FIFO_Pool.h
*/
#ifndef __FIFO_POOL_H
#define __FIFO_POOL_H
#include <boost/noncopyable.hpp>
#include <boost/pool/object_pool.hpp>
#include <boost/thread.hpp>
#include <boost/assert.hpp>
#include <queue>
namespace ikud {
template <typename T>
class FIFO_Pool : boost::noncopyable
{
public:
FIFO_Pool(int size);
virtual ~FIFO_Pool(void) { /*no-op*/ }
T* malloc(void);
void free(T* ptr);
int read(T** ptr);
int write(T* ptr);
private:
int capacity_;
int total_;
boost::object_pool<T> pool_;
boost::mutex pool_mutex_;
std::queue<T*> fifo_;
boost::mutex fifo_mutex_;
boost::condition fifo_cond_;
};
template <typename T>
FIFO_Pool<T>::FIFO_Pool(int size) : capacity_(size), total_(0)
{
BOOST_ASSERT(size > 0);
}
template <typename T>
T* FIFO_Pool<T>::malloc()
{
boost::mutex::scoped_lock lock(pool_mutex_);
T* ptr = NULL;
if (total_ < capacity_)
{
ptr = pool_.malloc();
if (ptr != NULL)
++ total_;
}
return ptr;
}
template <typename T>
void FIFO_Pool<T>::free(T* ptr)
{
BOOST_ASSERT(pool_.is_from(ptr));
boost::mutex::scoped_lock lock(pool_mutex_);
pool_.free(ptr);
-- total_;
}
template <typename T>
int FIFO_Pool<T>::read(T** ptr)
{
boost::mutex::scoped_lock lock(fifo_mutex_);
while (fifo_.size() == 0)
{
fifo_cond_.wait(lock);
}
*ptr = fifo_.front();
fifo_.pop();
return 0;
}
template <typename T>
int FIFO_Pool<T>::write(T* ptr)
{
BOOST_ASSERT(pool_.is_from(ptr));
boost::mutex::scoped_lock lock(fifo_mutex_);
fifo_.push(ptr);
fifo_cond_.notify_one();
return 0;
}
} // namespace ikud
#endif // __FIFO_POOL_H
2013年7月4日
通俗的说:子函数可以使用父函数中的局部变量,这种行为就叫做闭包!
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c = a();
c();
2013年6月28日
这段时间打算从ACE库转移到boost库上,遇到很多问题.
boost的singleton没有单独的库实现,在1.33.1版本发现了两处:
/usr/include/boost/thread/detail/singleton.hpp
/usr/include/boost/pool/detail/singleton.hpp
thread库里面的实现非常简单,采用函数里面static变量仅被初始化一次的特性,整个实现就两句话:
static singleton<T> s_oT;
return(s_oT);
这个就是网上说的2B青年的做法,缺陷啥的不多说了.
pool库的实现就比较复杂,思想是在main函数调用前,就先实例化,并解决多线程的问题,缺陷就是不能lazy了.
2009年9月23日
摘要: (一)
1.下载apache_2.2.13-win32-x86-no_ssl.msi
2.下载php-5.3.0-Win32-VC6-x86.zip
注意VC6版本for Apache, VC9版本for IIS
php-5.3.0-nts-Win32-VC6-x86.msi不能为Apache正常安装(?)
3.下载mysql-5.1.38-win32.msi
阅读全文
2009年9月21日
2009年9月16日
FreeTDS is a set of libraries for Unix
and Linux that allows your programs to natively talk to Microsoft SQL
Server and Sybase databases.
官方网站: http://www.freetds.org/
摘要:
Python基本安装
Python文档
常用插件
常用工具
推荐资源
阅读全文
2009年9月11日
摘要: Lua 5.1 参考手册 http://www.codingnow.com/2000/download/lua_manual.html
by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes
云风 译 www.codingnow.com
Copyright
© 2006 L...
阅读全文
Lua 是一个扩展式程序设计语言,它被设计成支持通用的过程式编程,并有相关数据描述的设施。 Lua 也能对面向对象编程,函数式编程,数据驱动式编程提供很好的支持。 Lua 可以作为一个强大、轻量的脚本语言,供任何需要的程序使用。
Lua 以一个用 clean C 写成的库形式提供。(所谓 Clean C ,指的 ANSI C 和 C++ 中共通的一个子集)。 官方网站:http://www.lua.org/ 常用网站:http://lua-users.org/ http://luaforge.net/ a catalog of Lua projects,e.g. LuaSocket、
LuaSQL