- 博客(22)
- 收藏
- 关注
原创 运行时库的配合问题
今天在编译工程的时候出现链接错误,主要的原因还就是在引用运行时库的问题。那么引出一个好像平时不是特别多人注意的问题。在一个比较大的工程中,常常包含很多静态库和动态库。但编译的时候经常通不过,就细节而言,往往是因为引用的库和当前工程的运行时库不吻合,那么在Windows下比较重要的问题就是使用统一的运行时库,并且将Debug和Release分开,区别对待。
2006-08-30 16:59:00 847
原创 ACE Link gettimeofday的错误
今天在使用ACE_OS:: gettimeofday的时候,在Debug版本上编译正常,但是在release版本上出现编译问题。我上网查了一下,可能是与run-time library有关。于是检查这一选项,果然发现问题。在Release的时候选用了Debug Mutithreaded DLL,把这一项改成Mutithreaded DLL就编译通过。由此导出一项注意,在ACE编译的时候,一定要搞定
2006-08-30 15:34:00 1871
原创 ACE的读写锁
ACE定义了四个宏:ACE_WRITE_GUARD、ACE_WRITE_GUARD_RETURN、ACE_READ_GUARD、ACE_READ_GUARD_RETURN。这四个宏的目的是为了实现高效的读写机制。其实就是定义两种对象:ACE_Read_Guard和ACE_Write_Guard。这两个类的意义在于在构造的时候,自动对应类型的锁,在析构的时候释放。为了保证高效率,如何构
2006-08-29 15:16:00 6881 6
原创 ACE_Condition_Thread_Mutex源码剖析
ACE_Condition_Thread_Mutex是ACE线程级别的条件变量。对于ACE_Thread_Mutex来说,它是被引入到ACE_Condition_Thread_Mutex中,作为ACE_Condition_Thread_Mutex的一个引用成员。另外ACE_Condition_Thread_Mutex还存在一个ACE_cond_t作为条件变量。ACE_Condition_Threa
2006-08-25 11:13:00 2613
原创 C++编程规范之模板与泛型
模板与泛型第64条:理智地结合静态多态性和动态多态性摘要:努力让这二者互补,让1+1>2。 涉及到模板的话题总是很复杂,如果将模板和虚拟结合到一次,本来就是个不简单的话题。 动态多态性的优点是基于超集/子集关系的统一操作,动态绑定和分别编译。静态多态性的优点是基于语法和语义的统一操作,静态绑定和高效率。在ACE中使用比较多的这种组合,将来可能会写一下设计
2006-08-24 17:45:00 971
原创 NMS PCI卡的注意事项
在使用NMS PCI的卡的时候,需要注意的问题是H.100的Bus线的问题。如果使用多块PCI的卡,那么需要将H.100 Bus用总线串起来,否则跨卡操作会出现问题。
2006-08-23 19:10:00 750
原创 ACE_Message_Queue源码剖析
想到写这个是因为昨天看到Unix下服务器的模式,其中一种有一个线程用来accept,并将请求放在有界临界区中,其他工作线程池通过访问有界临界区获取请求,执行请求。所以就想追溯一下使用ACE_Message_Queue实现这种模式的可行性。对于ACE_Message_Queue其他功能不做深究。 ACE函数看上有这么两种Function X和Function X_i。后
2006-08-23 11:45:00 2725
原创 C++编程规范之名字空间与模块
名字空间与模块第57条:将类型及其非成员函数接口置于同一名字空间中摘要:非成员也是函数:如果函数也是类X接口的一部分,那么也要放入相同的名字空间中定义它们,以便正确实用。 名字空间是屏蔽名字污染的好工具。当系统变得很大时,没有人能确定彼此之间不存在冲突,名字空间能有效控制这样无意识的错误。 第58条:应该将类型和函数分别置于不同的名字空间中,除非有意识让它们一起工作
2006-08-22 19:36:00 1037
原创 Singleton模式的静态局部变量的问题
//”TestSingleton.h”class TestSingleton{TestSingleton& Instance(){static TestSingleton myTest; return myTest;}} 这是Singleton的写法,请问有问题么?也许有,也许没有。看你的运气了。这样的做法真是让自己命悬一线。可怕的错不是那种狰狞的错误,而是这样
2006-08-17 18:23:00 1785 6
原创 C++编程规范之构造、析构与复制
构造、析构与复制第47条:以同样的顺序定义和初始化成员变量摘要:与编译器一致。成员变量初始化的顺序要与类定义中声明的顺序始终保持一致。 之所以说这一点,其实还是一个老问题,就是变量间相关依赖的问题。成员变量之间的依赖并不是个好现象,如果可以尽量减少这种依赖,如果出现循环依赖就不好了。我的建议是不要指望编译器首先会初始化哪个成员对象,这是我们所无法控制的。 第48条:
2006-08-17 15:59:00 1084
转载 Exceptional C++ Style目录
泛型编程与C++标准库 1 第1条 vector的使用 2 第2条 字符串格式化的“动物庄园”之一:sprintf 9 第3条 字符串格式化的“动物庄园”之二:标准的(或极度优雅的)替代方案 14 第4条 标准库成员函数 23 第5条 泛型性的风味之一:基础 26 第6条 泛型性的风味之二:够“泛”了吗 30 第7条 为什么不特化函数模板 36 第8条 友元模板 42 第9条 导
2006-08-16 17:10:00 772
原创 C++编程规范之类的设计与继承
类的设计与继承第32条:弄清楚要编写的是哪种类摘要:了解自我:有很多种不同的类。要弄清楚要编写的是哪一种。 类的分类是如此之多,然而我们写的时候未必知道我们可能存在哪些疏忽。所以清晰类的分类应该对细节很有好处。 值类,事实上意味着c的struct。也就是说作为值类,仅仅是值的集合,而不该包含别的。最好让编译器实现构造函数,不要带有虚函数,包括析构函数。否则会
2006-08-15 18:35:00 857 1
原创 ACE_Guard的运用
对于,线程锁来说,最可怕就是出现由于某种原因没有解锁从而造成线程死锁。C++的对象构造和析构给出了很好的办法,具体的实现不外乎先前《自行释放ACE_Message_Block》中所写的那样。这里所要说的是ACE已经作了的工作。#define ACE_GUARD_ACTION(MUTEX, OBJ, LOCK, ACTION, REACTION) / ACE_GuardMUTEX > O
2006-08-10 14:51:00 8860 1
原创 关于Socket编程的一点思索
今天在做测试的时候,发现Socket通信很慢的情况。这让我觉得需要有些地方要做一些优化的工作。现在使用的是异步Socket,使用同一个线程进行收发。在这种情况下,就会出现一个包可能在recv的时候无法一次收齐,特别是一些长度比较长的包。这时候应该有两种做法,一是在recv一次后,立刻让出线程,无论包有没有收完;二是,分成两个Socket,一个收一个发,不至于因为收的情况,影响到发的问题。这两种
2006-08-08 18:21:00 1166
原创 SIP的early media和SDP协商
在SIP的运行中,我只算是刚刚入门,这里只写一些很浅显的心得。慢慢的积累,总可以能有大成。 RFC3960描述SIP的early media能力。early media相当于Q.931中accept call,在通话之前建立媒体流。我曾经测试过early media的能力。我在180消息中发送了SDP,在此消息后,媒体流建立。但是在这个情况下,并非完全正常。因为在18
2006-08-07 18:49:00 14306
原创 C++编程规范之函数与操作符
函数与操作符第25条:正确地选择通过值、(智能)指针或者引用传递参数摘要:正确的选择参数:尤其要分清参数传递的性质。 对于输入参数,可以尽量使用const类型,变量可以使用const变量,因为变量复制的代价是极小的;至于对象可以使用const指针或者引用的方式进行传递。这样可以减少复制带来的代价。 对于输出参数,如果参数的可选的,可以使用指针来进行传递,而用
2006-08-06 15:54:00 981
原创 从ACE源代码库看Socket编程应该怎么写
我的同事和我说,传说中神乎其神的程序员很多,但未必有很多人会写Socket编程,我曾经不以为然。我曾经看过不少Socket编程的Demo,也就认为Socket编程也就这样了。但或许我错了。我的同事告诉我,socket编程和高效socket编程是两码事,我也不以为然。我曾经很鄙视微软RPC。所有的一切一切证明我都错了。 错误的原因在于我看到了ACE的源码。下面是一个片断
2006-08-04 18:52:00 2393 1
原创 不要轻易在头文件中打开namespace
今天发现一个错误在编译一个类似于DWORD test(void *list);出现错误,错误竟然是和std::list冲突,吐血。我不能确认这是C++语义的问题还是VC6太土了,但这个问题需要集中避免,我不知道什么会导致这么夸张地问题,结果我找了好些文件。在某个头文件中,发现了using namespace std; 我想它一定难辞其咎。结果我把这一行注释掉,就发现一切OK。所以,这一
2006-08-04 18:12:00 988
原创 C++编程规范之编程风格
编程风格第14条:宁要编译时和连接时错误,也不要运行时错误摘要:能够在编译时做的事情,就不要推迟到运行时。 我记得在《重构》中有一条叫做“用测试取代异常”,我觉得差不多表达的是一个意思,即运行期错误的代价比较大,所以尽量转化成编译期错误和链接错误。这和人生的道理是相通的,我一直坚持认为,如果一定要摔跟头的话,越早摔越好。因为摔得越晚,成本越高。但同时还有一个问题就是,千万不
2006-08-04 14:57:00 1314 1
原创 C++编程规范之设计风格
设计风格第5条:一个实体应该只有一个紧凑的职责摘要:一次只解决一个问题:只给一个实体(变量、类、函数、名字空间、模块和库)赋予一个定义良好的职责。随着实体变大,其职责范围自然也会扩大,但是职责不应该发散。 对于string的抱怨见于Sutter先生的《Exceptional C++ Style》,其中将string做了完全的解构,非常精彩。 事物往往是由小变
2006-08-03 14:27:00 1052
原创 Java对象赋值引发的问题
今天,工作中遇到一个问题。同事在Java编写的时候出现一个问题,就是Java有一个队列,然后new出来一个对象,后续操作是不断收到事件然后将对象用operator = 赋值后,加入队列中,这样直接的后果导致队列中的对象是重复的。引发的原因就是因为Java中对象赋值和C++的对象赋值不一样,Java是引用而C++默认是浅拷贝。所以导致了这个问题。因为队列中的对象引用的同一块内存。在使用C++
2006-08-02 20:36:00 3275 1
原创 C++编程规范之组织和策略问题
组织和策略问题第0条:不要拘泥于小节(了解哪些东西不应该标准化)摘要:只规定需要规定的事情:不要强制施加个人喜好或者过时的做法。程序的编写存在一些准则是必要的,例如命名准则,但没有必要要求所有人都遵守这些,否则条条框框太多,否则限制了语言的能力。函数并不是单入口单出口,虽然表面上看是的。 第1条:在高警告级别干净利落的进行编译摘要:高度重视警告:使用编译器最高的警告级别
2006-08-01 20:21:00 759
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人