Jump to Navigation

C++

C/C++编程

Gearman分布式任务处理系统学习与研究

1. 主页: http://gearman.org/

2. 介绍

3. 同类软件

beanstalkd

Category:

LLVM 3.1发布了

延迟发布,不过还是发布了。
不少改进,主要是c11, c++11的新语法支持,其他性能优化和bug修正。

原文链接:
http://www.llvm.org/releases/3.1/docs/ReleaseNotes.html

Category:

初步使用Android NDK的感受

Android NDK是Android平台提供的C/C++开发接口。

NDK整套工具链完全由google提供,升级支持。

由于Android的底层是基于linux的,内核及之上,java虚拟机以下,

而NDK则正针对是的这一部分,所以,与正常的linux gcc编译工具链差不多,

不同的地方在于,

1. 这是一个交叉编译工具链,链接目标为ARM系

2. 这个工具链自定义了一些android平台相关的宏

3. 有自己的Makefile规则及扩展

对于一般的命令行项目,移植还比较容易,当然这不包括音频、视频处理。

像linux常用的音频软件,alsa,pulseaudio目前都没有成熟的移植,使用了这些的软件包移植时,需要把这部分扩展到android的音频、视频框架。

直接使用NDK做GUI的功能非常弱,非常不成熟,稍微好点的有个qt移植lighthouse,使用起来比较麻烦,并且做出的界面风格与android普通应用风格区别很大。

使用NDK的好处是可以移植大量的linux C/C++开源开发库。

最近移植了几个开发库,遇到的问题还不太多,一般在asm这块,或者一些不常见的函数实现问题。

Go语言入门Hello go!!!

Google前不久发布了Go语言正式版本go1,号称web时代的C语言。

这了工作需要,也了解了一下这个语言的基本原理及应用。

今天从最入门级的Hello go!!!开始,虽然go语言是看了眼前一亮的语言,在发文不免也有点落了俗套了。

上代码:

$ cat hello.go
package main

import "fmt"

func main() {
fmt.Println("Hello go!!!");
}

假设已经全局安装了go编译系统,go命令在PATH中
使用go build 即可编译出可执行程序,程序名为hello
执行./hello看到结果。

代码解释:
package main这是必须的,每一个go语言源文件都必须作为某个包的一个源文件存在

import "fmt" 也许不是必须的,如果不引入任何包,go语言能做什么?import与 java中的import指令功能相同,引入一个包

func main () 这是作为入口的源文件必须的函数,对应C的main函数

Category:

GCC 4.7.0 发布,庆祝 GCC 25周年

GCC 首个公开发布版本是在 1987 年由 Richard Stallman 发布的,到今天已经整整 25 年了。

 

为了庆祝 25 周年,GCC 也相应发布了 GCC 4.7.0 版本,这是 GCC 一个全新的重要版本。

 

GCC 4.7.0 带来了一组关于链接时优化 (LTO) 框架可提升伸缩性和降低内存使用,据开发者称,在 64 位系统上需要 8G 内存来对 Firefox 进行优化,而是用了 LTO 后只需 3G。

 

此外就是体验的支持软件事务内存,支持更多 C++11 标准,包括原子性、C++11 内存模型,用户定义文字、别名声明、构造器委派和可扩展的语法等。

 

GCC 4.7.0 还改进对 Fortran 的支持,支持 Google Go 1 等等多项改进。

 

Category:

Boost与Qt的信号/槽及执行线程

Boost与Qt均提供了线程功能,信号/槽功能,
但Qt有自己的事件循环功能,Boost没有自带的事件循环,如需要使用的话,需要自己实现。

Qt的了自带的事件循环,但在使用的时候可能与某些库的线程有冲突,
最近遇到一个此种类型的奇怪问题,没有找到问题所在,也没有好的解决方法。

经过多次测试,理清了Boost与Qt的信号/槽及执行线程之间的一些关系,记录下这些规律以备份后用、讨论。

针对这个Qt事件循环冲突的问题,设计了一个GUI应用程序的架构,说来也比较简单,把GUI线程与核心功能模块分离,GUI相关操作在Qt的事件循环中执行,核心功能在另一自己编写的简单boost线程中执行。
两模块之间的通信不是使用的直接的函数调用实现,而时使用实现了异步调用,相互之间不会有任何事件交叉,不会引起问题。异步调用有两种方式,可以使用两者的信号/槽,或者可以使用一些进程间通信(IPC,SOCKET,管道,消息队列,共享内存)的功能。

在本次测试实现中,由于功能的需要,两种方式都实现了相应的功能。

Category:

nullfxp中的ssh反向端口代理功能模块说明

ssh的反向代理功能,可以实现基于ssh连接的安全地端口转发功能。还可用于把内网机器端口安全转接到外网服务器。

Category:

在桌面应用程序中使用嵌入式关系数据

桌面应用程序,与网络应该程序一样,也需要记录用户的当前使用状态,

在用户下次使用时,可以使用这些状态数据还原到用户上次的状态。

对于像一些日程表工具,桌面笔记,联系人卡片,都需要记录关系型数据。

在数据量小的时候,随便使用的一种格式的数据文件,甚至文本文件都可以,

但如果用户的数据量大了,还是使用正式的数据库更有伸缩性,扩展性。

但是正式的关系数据库,即使最小最快的sqlite,在真正使用的时候,都会有一些额外的开销,

表现在程序响应慢等问题,却是为了扩展性,损失性能的一鲜活的应用场景。

虽然说,对于特定的应用,可以实现特定的针对此应用的数据库也许多效率更高,

很多时候必要性不那么大,一般也就不是最优选择。

自己做过几个小应用使用嵌入式sqlite数据库,但几次都没有找到一种好的维护方法,

导致在更新到读写数据库/创建新数据库的时候,响应慢,不浅显流畅,所以不需要仔细做些研究,

在使用方式,数据库优化方面找到方法。

Taxonomy upgrade extras:

新C++0x标准试用

最近在为工作做一个试验型项目,使用C++开发,属于逻辑流控制型,基本没有计算,大部分模块不要求效率,

借前不久的C++2011标准,gcc-4.6.0新版本发布,开发1w多行代码。

这个项目的设计在自己的服务器上运行,自行安装维护,不需要考虑过多的系统兼容性,

大量使用方面的新功能没有问题,另一个关键问题还在于稳定,因为这是一个理想状态下需要daemon运行的程序。

新的C++2011标准提供了许多很好的功能,

简化代码,有auto自动类型推导,多用于泛型代码,不需要在使用一长串的模板参数

还可使用代码的统一初始化功能,即使复杂的类型,也可在声明时方便给初始值。

灵活代码,有lamba表达式,用于一些常用算法。

省事代码,有智能指针,指针不再裸奔,不过由于使用的一些C库比较多,有些地方没能用。

还一个在特殊场合提高代码效率的“右值引用”,我喜欢把它称作“乾坤大挪移”。

另一个在多线程中常用到的原子类型及相应原子操作,在<atomic>中。

其他更多的新功能看gcc官方吧。

在试运行过程也遇到问题,对系统要求比较高,但运维人员给安装的服务器系统都比较老,

Taxonomy upgrade extras:

使用C++0x与boost编写的异步信号回调计时器类

这个类的接口与QTimer类似,能对现有代码改动极小的情况下取代QTimer

这个类使用linux上的timer_*系统调用实现,只能用于linux平台,但使用boost:signals2实现了类似Qt的信号回调机制。

编写这个类本意是学习一下boost的信号机制,没想到测试效果非常好,达到完成替代QTimer类的功能,在此列出,

Category:

页面

订阅 RSS - C++


Main menu 2

by Dr. Radut