huyc

导航

随笔分类 -  C/C++

一些小发现
锁与信号量
摘要:本文提到的是posix的互斥锁和信号量。最近测试了pthread_mutex_t和sem_t的性能,发现这两个东西并不存在什么关联,深层次的差别非常明显,具体来说,有以下几个地方:1.pthread_mutex_lock/unlock操作与sem_wait/post操作,在循环测试中,前者时间大约是后者的2倍,循环越大,差距越小,但总是存在的。2.pthread_mutex_lock/unlock文档里边明确提到,它们的错误码不包括EINTR,也就是说不会被信号打断,内部要么重启了系统调用,要么根本没有调用系统调用,或者直接屏蔽了信号;sem_wait/post则可以返回EINTR,这起码说明 阅读全文

posted @ 2012-11-25 17:41 huyc 阅读(1535) 评论(0) 推荐(0)

基于Linux 2.6内核ALSA架构的PCM混音demo
摘要:一个混音例程,多声道混音成单声道,录制下了原始声音和混音之后的声音。混音之后的声音是8kHz,16bit,带符号单声道的声音。#define ALSA_PCM_NEW_HW_PARAMS_API#include <alsa/asoundlib.h>#include <alloca.h>#include <stdio.h>void mixchannel(FILE *fp, const snd_pcm_channel_area_t *areas, unsigned int chs, snd_pcm_uframes_t offset, snd_pcm_uframe 阅读全文

posted @ 2012-10-26 16:44 huyc 阅读(6298) 评论(0) 推荐(0)

长度可变的C语言宏
摘要:在上大学的时候,对printf就有非常困惑的疑问,因为它的原型是这样的:int printf(const char *fmt, ...);现在则需要另外一个类似的东西:长度可变的宏定义以下是两种方案,clang和gcc均测试通过。CASE 1:ISO c99标准里边定义了一个预处理宏__VA_ARGS__,可以像这样来定义一个println:#define println(fmt, ...) printf(fmt"\n", __VA_ARGS__)println("%d", 1);println("%d", 2);这个宏的麻烦之处在于 阅读全文

posted @ 2012-10-26 16:28 huyc 阅读(574) 评论(0) 推荐(0)

没有银弹,合适与正确的距离
摘要:今天在网上查看QThread的信息时找到一篇文章,http://hi.baidu.com/cyclone/blog/item/5fac3bc7ab1b90d1d10060f2.html文章引述了老外的观点说什么是QThread的正确使用方式,文章很短,一下子就看完了,看了无非就是说QThread的正确使用方式应该是事件驱动。的确,标准的Qt程序就应该像这样:#include <QCoreApplication>#include <QDebug>int main(int argc, char **argv){ QCoreApplication app(argc, argv 阅读全文

posted @ 2011-12-03 21:11 huyc 阅读(312) 评论(0) 推荐(0)

接力,智能指针也麻烦
摘要:C++的指针也不是很麻烦的东西,但是无数的人都说麻烦,弄了个智能指针来管理数据,原本就该小心的指针操作顿时变得需要耐心,细心而有毅力……核心问题在于,智能指针的引用计数是要通过拷贝函数或者构造函数传递的,表面上看,+1-1=0,但是实际上不完全是这么回事,如果将对象分别包装两次,那这个对象也会被释放两次。问题是智能指针计数为0时的副作用——它会释放掉这个对象,这就导致了指针使用上的歧义,明明没有释放,但莫名其妙的就没了,而且如果整个程序都用智能指针的话,跟踪出来哪里实际delete了指针可能很困难。另外存在的一个问题也很明显,如果将一个栈指针包装到智能指针里,释放的时候指不定出什么事情,但是却 阅读全文

posted @ 2011-10-25 18:38 huyc 阅读(233) 评论(0) 推荐(0)

C语言的指针小发现
摘要:众所周知,C语言是有指针的,指针本身又是一个数据。C语言的所有数据都是存储在容器中的,指针作为一种数据,自然应该有一个容器。然而C语言的指针在两个地方是特别的,或者说有三种行为,其中两种比较怪。第一种是纯数组,这种数据带占据连续的内存,没有间隙,可以随意用不同的指针转换之:1 char arr[64]; //64个char2 int *arr1 = (int *)arr; //64/sizeof(int)个int3 double *arr2 = (double *)arr; //64/sizeof(double)个double更奇怪... 阅读全文

posted @ 2011-09-25 22:42 huyc 阅读(429) 评论(0) 推荐(1)