摘要: 1 可重入,线程安全,异步信号安全之间的区别? 可重入:可以重复进入,不会引起问题(这个概念最宽) 线程安全:被多个线程使用时,不会出问题,也就是可以被多个进程重入(新函数和被终端和被中断的函数不在同一线程) 异步信号安全:可以被信号函数重入(信号处理函数和被中断的函数在同一线程) 可重入必然线程安全,必然异步信号安全 线程安全与异步信号没有关系 举个例子,一个函数使用了全局变量,那么它是不可重入的,但是如果给它加上锁(),那么它就是线程安全的,但是不是异步信号安全的,因为此时会死锁 那么如何让它成为异步信号安全的呢?在函数开头阻塞所有信号,结尾解除阻塞,那么它就是异步信号安全的了,当然,它锁 阅读全文
posted @ 2013-01-13 13:11 mightofcode 阅读(174) 评论(0) 推荐(0) 编辑
摘要: 1,为什么程序11-1的输出与书上不同? 在我的机器上: new: pid 3558 tid 3067210560 0xb6d1eb40new: pid 3558 tid 3058817856 0xb651db40new: pid 3558 tid 3075603264 0xb751fb40main: pid 3558 tid 3075606208 0xb75206c0new: pid 3558 tid 3050425152 0xb5d1cb40 可以看出pid是一样的,也就是说是一个进程,而且tid实际上是指针,书上讲的是以前的LinuxThreads实现,现在linux使... 阅读全文
posted @ 2013-01-12 13:37 mightofcode 阅读(346) 评论(0) 推荐(0) 编辑
摘要: apue啃到第十章了,随着内容越来越深入,发现似乎hold不住了,因此在这里记录下我的一些心得1,signal的函数声明为什么是这样? 如果要返回一个函数指针就需要这么些,至于为什么可以参看:http://blog.csdn.net/zimingjushi/article/details/6554801,这篇文章解释了一些东西,但是依然让人很迷惑:(除了typedef外)没有更简单直观的方法吗? 我觉得这涉及到c语言语法分析的一些东西,以后有时间再仔细研究2,《不可靠的信号》中的两个例子说明了什么? a,由于信号动作被复位,嵌套的中断会引起问题 b,如果用户想用pause等待一个... 阅读全文
posted @ 2013-01-03 22:24 mightofcode 阅读(290) 评论(0) 推荐(0) 编辑
摘要: FILE* fopen(const char*,const char* type)大一刚学编程的时候就对fopen的参数很迷惑,今天仔细思考了fopen的参数的格式,我觉得参数设计得很不合理fopen的格式是这样:r 读w 写,文件截断为0a 写,添加模式+ 读+写b 二进制打开rwa是主位,+b是修饰位 但是我认为这个接口并不友好,因为这几个字符的功能并不是正交的rwa看上去就是分别代表read write append,仅仅是看上去而已,但是w竟然还有截短的功能,而a也暗含了write的意思,+则表示读写.用的时候还得去回忆这几个字符代表的意思,非常不直观如... 阅读全文
posted @ 2012-12-15 00:29 mightofcode 阅读(440) 评论(0) 推荐(0) 编辑
摘要: 虽然我对boost,模板,乃至c++都很不爽,但是最近在看一套代码,里面的基本架构全是模板,无奈只好补补功课,认真学一下模板首先从tuple开始tuple,pair升级版,能容纳多个元素用处:使用它可以很方便的返回多个值(有什么其它的用处没?)下面是一个简单的实现struct null_type//建一个默认符号{};//注意模板的默认值template<typename T0=null_type,typename T1=null_type,typename T2=null_type>struct uttuple{ T0 value0; T1 value1; T2 value... 阅读全文
posted @ 2012-12-05 18:51 mightofcode 阅读(282) 评论(0) 推荐(0) 编辑
摘要: 本章讨论了堆堆有两个属性1,子节点大于或等于父节点 2,树中没有洞堆的特点是堆始终是平衡树,每个操作的复杂度都是ln(n),根节点总是最小的堆排序的代码:#pragma region heap int siftDown(int* buf,int pos,int len){ while(1) { int left=pos*2+1; int right=pos*2+2; int n; if(left>=len&&right>=len)break; else if(left>=len)n=right; e... 阅读全文
posted @ 2012-11-24 18:41 mightofcode 阅读(242) 评论(0) 推荐(0) 编辑
摘要: 亚马逊上有一个关于<设计模式>这本书的评论,讲得很有道理,於我心有戚戚焉... well, it's over. "Patterns" have not revolutionized the world. Nor does this book need to be "studied" for deep insights.What it seems patterns are actually good for is giving common names to popular solutions to problems, to make 阅读全文
posted @ 2012-11-19 16:30 mightofcode 阅读(278) 评论(0) 推荐(0) 编辑
摘要: 1,通过不断向intSet插入元素判断是否重复 stl::set使用二叉查找树,在当m=maxval时有最差情况2,增加个bool find(int t)?,想不到怎么再让它更强壮了3,无论是数组,链表,向量,insert要比find快一点点,但是都是同一个数量级的4,减少了函数调用的开销,这是巨大的优化,而且不会栈溢出5,一次分配,重复使用,类似的东西还有对象池,线程池等各种池6,此时数组,链表,位向量,桶会达到最优情况,二叉查找树会达到最差情况7,使用标记元素,插入时删除8,不大理解,怎么"同时在许多位上"进行并行操作?9,使用移位进行除法,这样每个桶都必须装2n个元素 阅读全文
posted @ 2012-11-13 17:32 mightofcode 阅读(196) 评论(0) 推荐(0) 编辑
摘要: 本章讨论的问题:如何存储一组整数具体内容是:实现一个数据结构,能进行插入和按序输出几种实现:1,c++的set2,有序数组,必须首先知道最大空间,查找的效率是O(ln(n))插入的效率是O(n)3,有序链表,查找效率是O(n),插入为O(1),链表可以使用迭代进行搜索,也可以使用组分配进行优化,即预先分配一大块内存,而不是去申请许多小内存4,二分查找树,快速查找,快速插入,但是最坏情况下效率为O(n)View Code struct BTNode{ int n; BTNode* l; BTNode* r; BTNode(int _a) { l=r=N... 阅读全文
posted @ 2012-11-12 19:02 mightofcode 阅读(281) 评论(0) 推荐(0) 编辑
摘要: 1 ,rand的返回值最大值是7fff 使用位操作产生大的随机值 View Code int bigRand(){ return rand()<<15&rand();}int rand(int l,int u){ int k=(rand()%3)<<30&(rand()<<15)&rand(); return l+k%(u-l+1);}2,随机选取0-n之间的一个i,取i,i+m-1共m个数,结果取模3,m<n/2时,从n取一个数,在集合中的概率小于1/2,因此取值次数的期望是2这里题目的描述并不严谨4,总共要取m次,集合的大小 阅读全文
posted @ 2012-11-11 21:09 mightofcode 阅读(505) 评论(1) 推荐(0) 编辑