- 浏览: 10262 次
- 性别:
- 来自: 武汉
最新评论
文章列表
什么情况下需要用到锁呢,就是多线程在使用同一个资源(变量),比如,在类A中有一个变量int i,A创建了3个线程,i作为变量传递给了这3个线程,每个线程都需要对这i进行修改,那么在使用 i 的时候,这3个线程都需要进行锁操作。
第一步 声明纯虚类:
class Lock {public: /** * 析构函数 */ virtual ~Lock() {} /** * 加锁 */ virtual void acquire() = 0; /** * 尝试加锁 * @return 加锁成功则返回tr ...
线程池,首先要明白,线程池是用来管理线程类的,线程类的实现可以参考我前面说过的方法,连接:
http://konin.iteye.com/blog/2333332
既然是管理线程类,就必须要有一个容器(池子)来装这些线程类,同时间,要知道有那些线程类处于运行工作的状态,所以还要有一个容器装运行状态的线程
什么情况下需要用到线程池?
场景1、一个业务,可以通过某种规则,用多个线程来处理,而这些线程可以分别独立处理这个业务而不互相干扰,比如1000万条记录,每条记录的关键字段是数字,数字分别以0到9结尾,那么就可以用10个线程来处理,用一个线程池来管理这10个线程。
实现 ...
1.一般方法
一般情况下,使用线程,是用pthread_create函数创建一个线程,创建的过程中采用传递函数指针的方式来实现主体的业务逻辑。比如
/*thread.c*/ #include <stdio.h> #include <pthread.h> /*线程一*/ void thread_1( ...
有些操作系统支持 date 命令直接获取昨天的日期,比如
linux:
strdate=`date -1d +"%Y%m%d"`
系统的不同,导致date命令有的支持有的不支持直接获取,这里给一个通用的脚本:
#取昨天的时间month=`date +%m`day=`date +%d`year=`date +%Y`
month=`expr $month + 0`day=`expr $day - 1`if [ $day -eq 0 ]; then month=`expr $mont ...
1、数字===》string
USING_STD(string);
USING_STD(vector);
USING_STD(istringstream);
USING_STD(ostringstream);
USING_STD(ends);
USING_STD(setbase);
USING_STD(pair);
USING_STD(numeric_limits);
/** * 将指定数据转化为字符串 * @param t 待转为字符串的数据 * @return 字符串 */template<class T> string str(T t) { ...
相信做过服务端开发的应该都知道Redis的大名,它是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,我们后台是用C++开发的,问了下他们,用的缓存框架有Redis,SSDB,今天看了几个帖子,简单了解Redis的用法。记录一下过程。
首先去官网下载最新的Redis源码http://redis.io/解压之后,进入目录编译
make
make test
sudo make install
下载hredishttps://github.com/redis/hiredis解压之后,同样的
make
sudo make install ...
Redis协议
*<args><cr><lf> 参数个数
$<len><cr><lf> 第一个参数长度
<arg0><cr><lf> 第一个参数
$<len><cr><lf> 第一个参数长度
<arg1><cr><lf> 第二个参数
... ...
举例场景:存储游戏玩家的任务数据,游戏服务器启动时将mysql中玩家的数据同步到redis中。
从MySQL中将数据导入到Redis的Hash结构中。当然,最直接的做法就是遍历MySQL数据,一条一条写入到Redis中。这样没什么错,但是速度会非常慢。如果能够想法使得MySQL的查询输出数据直接能够与Redis命令行的输入数据协议相吻合,可以节省很多消耗和缩短时间。
Mysql数据库名称为:GAME_DB, 表结构举例:
CREATE TABLE TABLE_MISSION (
playerId int(11) unsigned NOT NULL,
missi ...
大约一年多前,公司同事开始使用Redis,不清楚是配置,还是版本的问题,当时的Redis经常在使用一段时间后,连接爆满且不释放。印象中,Redis 2.4.8以下的版本由于设计上的主从库同步问题,就会导致整个问题,不知是否确为这个Bug所致。但从那以后,我就很少敢去尝试使用Redis。曾想转投MongoDB,但公司同事给我的回复是,由于MongoDB宕机,数据丢失,公司损失惨重。于是,我一直停留在Memcached使用范畴,且用的还比较一般。
相关链接:
Redis实战
Redis实战之Redis + Jedis
Redis实战之征服 Redis + Jedis + Spring (一 ...
用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET
等。基于这些限制,有必要考虑Redis!
相关链接:
Redis实战
Redis实战之Redis + Jedis
Redis实战之征服 Redis + Jedis + Spring (一)
Redis实战之征服 Redis + Jedis + Spring (二)
Redis实战之征服 Redis + Jedis + Spring (三)
言归正传,目前Redis大概有3中基于Java语言的Client:?Jredis?Jedis?Redis4J
这里只说Je ...
场景:
linux服务器调用了webservice,等待webservice返回结果字符串A,A是utf编码格式,linux是采用的gbk编码格式,为了显而易见的看见A,需要把A转化为gbk格式进行显示,恰好A 带了bom头,转gbk的时候会失败,被bom给截断。
bom就只有3个字节,放在字符串的开始位置,这3个字节固定为:EF BB BF
可以考虑跳过这3个字节再进行转gbk就会OK。
比如 A为char *
string b = A+3;
可以在转之前判断前3个字节,比如
int ia ;
memcpy(&ia, A,1);//判断ia是否等 ...
boolUnicode::wstringToString(constwstring&s, string&t) {
wchar_twc;
for (wstring::size_typei=0;i<s.length();++i) {
wc=s[i];
if (wc<0x80) {
t+=static_cast<char>(wc);
}elseif (wc<0x800) {
t+=0xc0| (
boolUnicode::stringToWstring(conststring&s, wstring&t) {
t.reserve(t.length() +s.length());
wchar_twc;
unsignedintminval;
unsignedcharc;
string::size_typelen;
for (string::size_typei=0;i<s.length();i+=len) {
c=s[i];
if
equal_range
- 博客分类:
- linux C/C++
这个函数的作用是返回数组中某一个值的起始地址和结束地址,函数的使用前提是数组要排序好。
比如 vector<int> v1
v1.push_back(1)//下标0
v1.push_back(2)//下标1
v1.push_back(3)//下标2
v1.push_back(4)//下标3
v1.push_back(4)//下标4
v1.push_back(4)//下标5
v1.push_back(5)//下标6
pair<vector<int>::iterator ,vector<int>::iterator> ...
1、功能作用
lower_bound 的作用是在已经排好序的数组中返回第一个大于等于(不小于)你所给定的值。
比如,在vector元素中,有1,2,3,4,4,4,5.对应的下标是 0,1,2,3,4,5,6
通过lower_bound 查找4,那么返回的是下标3.
2、使用方法
首先看看lower_bound的函数原型有2个版本。
版本一:
template<class ForwardIterator,class T>
ForwardIterator lower_bound(ForwardItera ...