Jump to Navigation

C++

C/C++编程

gcc与clang内置原子操作函数研究

原子操作在实现多线程并发操作时非常重要的功能。

在现有的线程库中,一般通过提供锁的功能实现线程的互斥与同步。

但是锁的粒度比较大,在性能要求非常高的软件中可能会受限制。

原子操作函数则能在最小粒度上实现并发的互斥与同步,很多的无锁数据结构(lock-free data structure)库皆使用这些函数实现的。

不同的编译器提供的原子操作函数不相同,但总结下来,也就几种模式,包括:

*)原子加、减并返回操作结果,或者返回当前值后再加、减

*)原子与、或、异或并返回操作结果,或者返回当前值后再与、或、异或

*) test and set类功能,测试标识并设置相应的值

*) exchange/swap类功能,比较并交换值

*)

目前最新版本的gcc、clang的原子操作实现均符合c++11定义的原子操作6种内存模型:

Category:

使用clang编译完全支持C++11的Qt5

总结,通过这次折腾,

加深了对clang/llvm编译工具链的理解。

了解了些关于gcc与clang的内建原子操作机制与实现。

了解了clang当前3.2版本的一些问题。

了解了clang/llvm后续版本的一些新特性。

Qt5关于C++11的配置编译变量设置机制。

Qt5跨平台配置编译的实现机制。

软件包版本说明:

clang/llvm-3.2

libcxx-3.2

libcxxabi-svn-20130223

qt5.0.1

archlinux/kernel3.8.0/x86_64

参考资料:

Category:

karia2近期一点想法

karia2是一个开源的基于Qt4的命令行下载工具aria2的GUI 跨平台下载管理器项目。
aria2c是一个支持许多协议,支持多线程下载的命令行工具。

aria2c这个项目一直非常活跃,最近有点时间,看了一点源代码,发源其工程提供编译出来一个libaria2c.a的库,然后考虑是否能以嵌入方式与karia2界面整合成一个整体。
经一点测试,发现这种方式确实可以正常调用aria2c的下载功能。
因此对些做一些完善工作,从原来的xmlrpc模式修改为直接调用aria2c核心类的方式实现下载功能,以及其他的控制功能与状态监控功能。
目前已经出来一个可用版本,但还不够完善,需要不断完善。

另外,aria2c又提供了json-rpc和websocket-rpc功能,希望有时间的话,能通过比较好的设计模式,实现其提供的所有通信方式,最终打造一个像样的aria2c界面交互下载软件。

现在的代码在github.com提供一份,会定期的同步到sourceforge.net的svn中。
最新代码地址:
https://github.com/kitech/karia2

Category:

CURL 错误码 中文翻译

这几天用CURL做下载系统,经常会遇到一些问题,很多的错误还是和CURL的option有关。现在把这些错误码贴过来,方便查看一下。

Category:

图片搜索/匹配PHASH实现改进

phash是一个图片特征抽取算法实现,
该算法相对还比较简单,特征值只是一个64位无符号整数。
在使用PHP扩展程序处理的时候,原版本的扩展只返回资源类型的值,
只能实时做对比处理,无法把它存储起来。

通过阅读它的PHP扩展,发现修改一下代码即能把资源转变为整数返回,
添加一个扩展函数,PHP_FUNCTION(phash_toint);
参数为使用phash_imagehash返回的资源类型值,
实现函数为,
PHP_FUNCTION(phash_toint)
{
zval * h1_res = NULL;
int h1_resid = -1;
ulong64 * h1;
zval * h2_res = NULL;
int h2_resid = -1;
ulong64 * h2;

Category:

自己动手制作VC++2012绿色版

绿色版本需求:不需要安装即可使用,干净不带IDE,不带其他语言C#、F#开发工具,不带SqlServer相关开发工具,不带.NET4 SDK,
整个包较原版安装包小,支持编译调试版本的程序,支持x86、x64、以及x86交叉编译x64应用程序。

制作环境:
Windows 7 ultimate x64位 中文版本。
VS2011安装在默认的C:\Program Files (x86)\Microsoft Visual Studio 11.0\目录。
绿化环境在Z:\VC2012\目录。

1. 到MicroSoft官方网站下载 MicroSoft Visual Studio 2012 retail 30天试用版本,安装时选择只安装VC++工具,
包括x64开发包,但不包括IA64开发包。
测试运行无误,准备完毕。这原版VC++2012战用磁盘5.5G左右。

Category:

nginx耗时模块的不阻塞主事件循环的异步处理机制

1) 在模块中生成线程池,把nginx的请求交给线程序池来处理

不过,需要在模块的handler中把r->main->count++,并且返回一个NGX_DONE,

这个值必须+1,否则在handler返回后,连接会被nginx断掉。

2)使用upstream机制,把耗时请求放在backend进程处理,把nginx当一个连接池使用

这种方式稍微复杂,不是单单nginx模块的问题,实际是开发一个独立的fastcgi进程或者其他协议服务进程,

通过upstream访问后端。

线程池模式示例代码:

static ngx_int_t ngx_http_nullimp_handler(ngx_http_request_t *r)
{
r->main->count += 1;
pthread_t pth;
int pcr;
pcr = pthread_create(&pth, NULL, test_thread_proc, (void*)r);

return NGX_OK;
}

Category:

konsole-4.9.2的简单功能补丁

通过使用kbookmark类的description字段存储密码(当然是明文存储的),

在执行kbookmark中的ssh会话连接时,取出这个字码的值,

通过系统的sshpass执行自动登陆。

补丁.patch

Category:

php_gearman-1.0.3与gearmand-1.1.0在centos上的安装补丁

1、gearmand开发活跃,现已从0.x时代跨入了1.x时代

但是,有点问题,gearmand的编译系统对比较老的linux发行版不太友好

从0.x起,在centos-5.x上安装经常出编译问题,虽然其代码本身没有问题。

2、php-gearman扩展的开发速度落后gearmand的开发,不得不在升级gearmand的时候,

对php-gearman扩展稍做修改才能正常编译执行。

3、对gearmand-1.1.0包的修改,以linux sed命令方式做自动修改。

Category:

QCoreApplication小测试

为了健壮和安装的原因,程序功能经常分割成几个小的二进制(后台的)程序,而不是合并成一个庞大的程序。

Qt 4为那些需要GUI的Qt后台程序引入了模块的Qt库。多亏了面向嵌入式和许多明智的架构决策,Qt 5步入了新的层次。

看看几个简单的函数:

QCoreApplication app(argc, argv);
QTimer::singleShot(3000, &app, SLOT(quit()));
return app.exec();

这个非GUI Qt程序睡眠3秒后退出。

在我的原装i386 Kubuntu 12.04, Qt 4.8.1平台上,valgrind工具报告堆内存使用达102k,callgrind报告使用1.9M(×)内存。

让我们看一下现在的Qt 5版本的数据:valgrind报告堆内存使用为4.9k,callgrid报告使用了大约114k内存。

这意味着Qt5少使用了20倍的内存,少用了16倍的指令来构造QCoreApplication和控制一个事件循环。

Category:

页面

订阅 RSS - C++


Main menu 2

by Dr. Radut