- 浏览: 82624 次
- 性别:
- 来自: 北京
最新评论
-
lazy_:
怎么感觉看起来像ReadWriteLock?
多线程下的一种编程模式 -
splayx:
方世玉 写道自旋锁,用于读远大于写的并发场景很合适,参考JDK ...
多线程下的一种编程模式 -
方世玉:
自旋锁,用于读远大于写的并发场景很合适,参考JDK内部的CAS ...
多线程下的一种编程模式 -
teasp:
你这个是类似轻量级锁的办法,对于写少读多的情况确实很合适。也可 ...
多线程下的一种编程模式
文章列表
多线程下的一种编程模式
- 博客分类:
- 其他
今天在优化项目,看了几个关键路径上的调用,
有些是可以并发的,有些是需要加写锁的,
如果想在整条调用路径上做文章相当复杂,需要时间做不少分析,
接着又发现虽然不少地方都有写锁,但是真正触发这些写锁的机会不是很大。
在这种情况下,突然有一种想法,就是另写一条没有写锁的调用路径,
无写锁路径上的方法写法十分简单,在原本方法触发写锁的地方直接返回调用失败就好了,
若无写锁路径调用失败,再调一次原始的路径也就OK了。
简单说来就是这样:
if (!MethodReadOnly()) {
return Method();
}
bool MethodRea ...
C++ 一些关键字的解释
- 博客分类:
- C++
auto
在C++98/03中这个这个关键字用于声明块中的变量的生存期为自动生存期,
这个关键字不常用,因为即便省略,声明的默认就是auto的。
在C++11中,auto的含义改变为自动通过初值符推断声明的类型占位符。
也可以使用auto& ...
linux用户和用户组的简单操作,以及文件权限
- 博客分类:
- linux
只有在root权限才可以创造新的linux用户
adduser ab
创造名为ab的用户,
新用户是没有密码的,注意没有密码的用户不能用户登录。
passwd ad
给用户ab设置密码。
在终端可以看到:
Changing password for user ab.
New UNIX password:
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password:
passwd: all authentication tokens updated successfu ...
epoll的水平触发和边缘触发
- 博客分类:
- net
即Level-Triggered and Edge-Triggered
简单说来
Level-Triggered:
只要事件是处于就绪状态,你每询问一次,就告诉你一次它处于就绪状态。
Edge-Triggered:
只有在状态改变的时候告诉你,这也是为什么et模式下,建议用非阻塞的socket。
下面我们来看看epoll对于两类触发是怎么返回给用户的。
当用户调用epoll_wait时会返回一组事件,包括水平触发的或边缘触发的。
epoll中有两个重要的数据结构红黑树rbt,和一个就绪列表ready-list。
调用epoll_wait时其实就是从read ...
CPU的数据总线宽度与原子操作
- 博客分类:
- 常识
今天在思考一个问题:
两个线程访问一个变量A(初始化值是0),一个线程写(准备写的值是0xFF),一个线程读。
在没有锁的情况下,读的线程有没有可能读到的值是0x0F或0xF0。
为什么有这么一个疑问,
因为看到很多代码都是假设这个情况是不可能发生的。
最后在
http://stackoverflow.com/questions/54188/are-c-reads-and-writes-of-an-int-atomic
以及其他地方找到答案。
简单说来跟CPU的数据总线宽度有关,也跟cpu的cache策略有关,
但只要是地址关于总线宽度是对齐的,就能保证上 ...
http://learn.akae.cn/media/ch36s01.html(协议栈)
关于网络序列
因为网络连接可能建立在big-endian和little-endian的机器之间。
详见这篇文章http://splayx.iteye.com/blog/1739223
所以端口(port)、地址(ip)有必要从主机的字符顺序转为网络的字符顺序,
网络的字符顺序作为不同机器之间通讯的中间载体。linux(<arpa/inet.h>)提供了4个转化的操作。
uint32_t htonl(uint32_t hostlong);
uint16_t htons( ...
先看一段代码。
#include <iostream>
using namespace std;
class A {
public:
A() {
cout << "A()" << endl;
}
~A() {
cout << "~A()" << endl;
}
};
class B : public A {
public:
B() {
cout << &q ...
yum卸载了怎么办?
- 博客分类:
- linux
最近手贱把yum卸载了,搜来搜去找不到解决方案。
最后PE回答了我的问题。
如果把yum卸载了,可以去找yum的rpm包来安装。
在http://rpm.pbone.net上找出下面的rpm包,
yum-metadata-parser-1.1.2-2.el5
yum-3.2.19-18.el5
yum-rhn-plugin-0.5.3-30.el5
yum-security-1.1.16-13.el5
yum-updatesd-0.9-2.el5
我的机器选的是x.noarch.rpm。
然后逐一执行rpm安装指令:
rpm -ivh x.noarch ...
C++的行为规定是,
每个有虚函数的类,会有一张虚函数指针表,这张虚函数指针表指向最后实现的虚函数。
用指向派生类的基类指针调用函数时就会访问这张表。
从而体现了C++的多态技术,即指向派生类的基类指针可能有 ...
extern连接发生在什么时候
- 博客分类:
- C++
extern的连接发生在编译时的连接阶段,
但是看下面的代码中add()函数没有被调用,
extern void add();
int main() {
return 0;
}
此时没有定义add却没有编译问题,编译器的这个行为也不难理解。
因为add没有被调用,所以没定义也没关系。
extern void add();
int main() {
add();
return 0;
}
这样编译就不能成功,因为找不到add()的定义
test.cpp:(.text+0x5): undefined reference to `ad ...
string pattern = "(((http[s]{0,1}|ftp)://)?[a-zA-Z0-9\\.\\-]+\\.(com|cn|net|com\\.cn|org|biz|name|info|tv|cc|([a-zA-Z]{2,6}))(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)
?)";
能够优先匹配有这些com|cn|net|com\\.cn|org|biz|name|info|tv|cc|后缀的,
最后再看[a-zA-Z]{2,6}是否匹配得上。
...
ldb中log的读写分析
- 博客分类:
- ldb
log的读涉及到的关键变量如图所示。log文件在物理上是分块存储的,而在逻辑上一个个record存储的。
一个record可能跨越了几个block,所以每个record可能会被分为几个record,分别存储。
record的结构是[uint32_t crc32c校验][uint16_t 数据长度][uint8_t 类型]
log文件涉及到的record类型有
FULL == 1
FIRST == 2
MIDDLE == 3
LAST == 4
从字面意思我们可以很容易看出他们的作用。
这个类型可以有其他类型的,只是被log模块忽略。 ...
基本类型不用引用的原因
- 博客分类:
- C++
复杂的类型使用引用,可以减少拷贝而提高性能;
如果不希望引用被修改则带上const标志。
但是对于简单类型,如果是处于性能原因而使用引用,
那肯定是弄巧成拙的。因为使用引用之后,多了一些额外的索引标志,
这些的带来的消耗在时间和空间上都比不用引用要多一些。
使用gcc -S x.cpp -o x.s得到下列的代码的汇编的大小
int add(int a, int b) {
return a + b;
}
963Bytes
int add(const int &a, const int &b) {
return a + ...
python在打印字符串的时候会把目标串转成unicode编码,
然后在转换成平台指定的编码例如utf-8,ascii等格式。不同版本的python有默认encode方式。
python3.2:
print(sys.getdefaultencoding())utf-8
python2.7:print sys.getdefaultencoding()ascii
如果encode的格式跟字符串原先的格式不同(或者说不兼容)就会出错。
UnicodeEncodeError: 'ascii' codec can't encode characters in position xx-yy ...
static和const的使用
- 博客分类:
- C++
static
文件域+位置域(局部,类)
在一个类中声明了,在类外定义,static变量定义时所在的文件,就构成了该变量的作用范围。
一个类的static变量,如果在头文件中定义,
多个其他文件include这个文件的时候,就会使得这个static有多个实体。
也就是一个类定义了多个static变量,然后就会报错!
因为这个变量的作用域是由文件,类两者确定的,通过文件那一关,却没有通过类那一关。
所以类的static变量一般在类的定义文件cpp中定义,即初始化。
t.h
#ifndef _ZJJTT_
#define _ZJJTT_
#include <s ...