- 博客(30)
- 资源 (4)
- 收藏
- 关注
原创 多线程的那点儿事(之嵌套锁)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 嵌套锁这个概念,主要是为了根据编程中的一种情形引申出来的。什么情况呢,我们可以具体说明一下。假设你在处理一个公共函数的时候,因为中间涉及公共数据,所以你加了一个锁。但是,有一点比较悲哀。这个公共函数自身也加了一个锁,而且和你加的锁是一样的。所以,除非你的使用的是信号量,要不然你的
2011-11-30 19:40:00 23192 4
原创 多线程的那点儿事(之读写锁)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在编写多线程的时候,有一种情况是十分常见的。那就是,有些公共数据修改的机会比较少。相比较改写,它们读的机会反而高的多。通常而言,在读的过程中,往往伴随着查找的操作,中间耗时很长。给这种代码段加锁,会极大地降低我们程序的效率。那么有没有一种方法,可以专门处理这种多读少写的情况呢
2011-11-29 19:54:01 33865 15
原创 多线程的那点儿事(之原子锁)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 原子锁是多线程编程中的一个特色。然而,在平时的软件编写中,原子锁的使用并不是很多。这其中原因很多,我想主要有两个方面。第一,关于原子锁这方面的内容介绍的比较少;第二,人们在编程上面习惯于已有的方案,如果没有特别的需求,不过贸然修改已存在的代码。毕竟对很多人来说,不求有功,但求无过
2011-11-28 21:19:48 27714 4
原创 多线程的那点儿事(之C++锁)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 编写程序不容易,编写多线程的程序更不容易。相信编写过多线程的程序都应该有这样的一个痛苦过程,什么样的情况呢?朋友们应该看一下代码就明白了,void data_process(){ EnterCriticalSection(); if(/*
2011-11-27 21:53:02 43319 26
原创 多线程的那点儿事(之windows锁)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在windows系统中,系统本身为我们提供了很多锁。通过这些锁的使用,一方面可以加强我们对锁的认识,另外一方面可以提高代码的性能和健壮性。常用的锁以下四种:临界区,互斥量,信号量,event。 (1)临界区 临界区是最简单的一种锁。基本的临界区
2011-11-27 10:23:59 27642 5
原创 多线程的那点儿事(之自旋锁)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 自旋锁是SMP中经常使用到的一个锁。所谓的smp,就是对称多处理器的意思。在工业用的pcb板上面,特别是服务器上面,一个pcb板有多个cpu是很正常的事情。这些cpu相互之间是独立运行的,每一个cpu均有自己的调度队列。然而,这些cpu在内存空间上是共享的。举个例子说,假设有一个
2011-11-25 21:08:15 19122 3
原创 多线程的那点事儿(之数据互斥)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在多线程存在的环境中,除了堆栈中的临时数据之外,所有的数据都是共享的。如果我们需要线程之间正确地运行,那么务必需要保证公共数据的执行和计算是正确的。简单一点说,就是保证数据在执行的时候必须是互斥的。否则,如果两个或者多个线程在同一时刻对数据进行了操作,那么后果是不可想象的。
2011-11-24 22:00:57 27667 18
原创 多线程的那点儿事(之数据同步)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 多线程创建其实十分简单,在windows系统下面有很多函数可以创建多线程,比如说_beginthread。我们就可以利用它为我们编写一段简单的多线程代码, #include #include #include unsigned int value
2011-11-23 21:13:41 32005 16
原创 多线程的那点儿事(基础篇)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 多线程编程是现代软件技术中很重要的一个环节。要弄懂多线程,这就要牵涉到多进程?当然,要了解到多进程,就要涉及到操作系统。不过大家也不要紧张,听我慢慢道来。这其中的环节其实并不复杂。 (1)单CPU下的多线程 在没有出现多核CPU之前,我们
2011-11-22 21:11:13 59395 39
原创 用汇编的眼光看C++(之 总结篇)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 早在八月份的时候,就陆陆续续写了二十多篇用汇编语言看C++的博客内容。在此为了做一个概括,也为了朋友们看起来更方便,我们利用这么一篇博客对所有的文章做一个总结。如果有朋友们在观看的过程当中发现了问题,恳请多多指教,谢谢。 01)用汇编的眼光看C++(开篇) 02)用汇编的眼光
2011-11-21 21:34:05 49028 45
原创 一步一步写算法(之 算法总结)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 自10月初编写算法系列的博客以来,陆陆续续以来写了几十篇。按照计划,还有三个部分的内容没有介绍,主要是(Dijkstra算法、二叉平衡树、红黑树)。这部分会在后面的博客补充完整。这里主要是做一个总结,有兴趣的朋友可以好好看看,欢迎大家提出宝贵意见。 (1)...
2011-11-20 20:35:10 99776 120
原创 一步一步写算法(之 最大公约数、最小公倍数)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 求解最小公倍数和最大公约数是我们开始编程的时候经常需要练习的题目。从题面上看,好像我们需要求解的是两个题目,但其实就是一个题目。那就是求最大公约数?为什么呢?我们可以假想这两个数m和n,假设m和n的最大公约数是a。那么我们可以这样写: m = b *a;
2011-11-19 21:04:52 22791 15
原创 一步一步写算法(之 可变参数)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 可变参数是C语言编程的一个特色。在我们一般编程中,函数的参数个数都是确定的,事先定下来的。然而就有那么一部分函数,它的个数是不确定的,长度也不一定,这中间有什么秘密吗? 其实,我们可以回忆一下哪些函数是可变参数的函数?其实也就是sprintf、printf这样的函数
2011-11-18 20:56:00 8712 2
原创 一步一步写算法(之 A*算法)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在前面的博客当中,其实我们已经讨论过寻路的算法。不过,当时的示例图中,可选的路径是唯一的。我们挑选一个算法,就是说要把这个唯一的路径选出来,怎么选呢?当时我们就是采用穷尽递归的算法。然而,今天的情形有点不太一样了。在什么地方呢?那就是今天的路径有n条,这条路径都可以达到目的地
2011-11-17 18:27:23 68066 9
原创 一步一步写算法(之克鲁斯卡尔算法 下)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面在讨论克鲁斯卡尔的算法的时候,我们分析了算法的基本过程、基本数据结构和算法中需要解决的三个问题(排序、判断、合并)。今天,我们继续完成剩下部分的内容。合并函数中,我们调用了两个基本函数,find_tree_by_index和delete_mini_tree_from_gr
2011-11-16 19:49:43 9384
原创 一步一步写算法(之克鲁斯卡尔算法 中)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面说到,克鲁斯卡尔的算法是按照各个line的权重依次进行添加的,那么这就涉及到一个权重的排序问题。怎么排序呢?可以采用最简单的冒泡排序算法。可是这里排序的是数据结构,怎么办呢?那就只好采用通用排序算法了。void bubble_sort(void* array[],
2011-11-15 22:25:36 7112
原创 一步一步写算法(之克鲁斯卡尔算法 上)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 克鲁斯卡尔算法是计算最小生成树的一种算法。和prim算法(上,中,下)按照节点进行查找的方法不一样,克鲁斯卡尔算法是按照具体的线段进行的。现在我们假设一个图有m个节点,n条边。首先,我们需要把m个节点看成m个独立的生成树,并且把n条边按照从小到大的数据进行排列。在n条边中,我
2011-11-14 20:16:30 15288 3
原创 一步一步写算法(之 回数)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 回数的概念比较好玩,就是说有这么一个字符串str, 长度为n, 现在index开始从0->index/2遍历,那么str[index] = str[n-1-index],那么这种数据就是我们通常说的回数。比如说a = “a”是回数, a = “aba”是回数, a = "st
2011-11-13 11:52:14 7423 1
原创 一步一步写算法(之哈夫曼树 下)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面说到了哈夫曼树的创建,那下面一个重要的环节就是哈夫曼树的排序问题。但是由于排序的内容是数据结构,因此形式上说,我们需要采用通用数据排序算法,这在我之前的博客里面已经涉及到了(通用算法设计)。所以,我们所要做的就是编写compare和swap两个函数。通用冒泡代码如下所示,
2011-11-12 17:37:30 8171 4
原创 一步一步写算法(之哈夫曼树 上)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在数据传输的过程当中,我们总是希望用尽可能少的带宽传输更多的数据,哈夫曼就是其中的一种较少带宽传输的方法。哈夫曼的基本思想不复杂,那就是对于出现频率高的数据用短字节表示,对于频率比较低得数据用长字节表示。 比如说,现在有4个数据需要传输,分别为A、B、C、D,所
2011-11-11 20:19:16 9043 1
原创 一步一步写算法(之通用数据结构)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 上一篇博客介绍了通用算法,那么有了这个基础我们可以继续分析通用数据结构了。我们知道在c++里面,既有数据又有函数,所以一个class就能干很多事情。举一个简单的例子来说,我们可以编写一个数据的class计算类。class calculate{ int m; int
2011-11-10 20:30:14 10186
原创 一步一步写算法(之通用算法的编写)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面我们写过各种各样的算法,什么排序、查找、二叉树、队列、堆栈等等。但是我们在编写这些代码的时候却都有一个缺点,不知道大家发现了没有?那就是这些算法中使用的数据结构都是简单的int数据。所以,如果排序的是int,那么用起来没有什么问题。关键就是万一是其他的数据类型,那我们应该
2011-11-09 19:49:34 12604 1
原创 一步一步写算法(之链表重合)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 链表重合是一个好玩的问题。原题目是这样的:有两个链表,那么如何判断这两个链表是不是重合的?至于这个链表在什么时候重合的,这不重要,关键是判断这个链表究竟有没有重合。究竟有什么方法呢? 最简单的方法就是查看两者有没有共同点。那么依次判断就行了。int find
2011-11-08 20:32:30 6534 1
原创 一步一步写算法(之寻找丢失的数)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 假设我们有一个1亿个数据,其中数据的范围是0~1亿,也就是100M的数据。但是这个数组中丢了一些数据,比如说少了5啊,少了10啊,那么有什么办法可以把这些丢失的数据找回来呢?这个题目不难,但是它可以帮助我们拓展思路,不断提高算法的运行效率。 对于这个问题,我们一个最
2011-11-07 23:01:41 6898 7
原创 一步一步写算法(之prim算法 下)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前两篇博客我们讨论了prim最小生成树的算法,熟悉了基本的流程。基本上来说,我们是按照自上而下的顺序来编写代码的。首先我们搭建一个架构,然后一步一步完成其中的每一个子功能,这样最后构成一个完成prim算法计算过程。 f)将DIR_LINE队列中不符合的数据删
2011-11-06 12:39:22 5466
原创 一步一步写算法(之prim算法 中)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 C)编写最小生成树,涉及创建、挑选和添加过程MINI_GENERATE_TREE* get_mini_tree_from_graph(GRAPH* pGraph){ MINI_GENERATE_TREE* pMiniTree; DIR_LINE pDirLine
2011-11-05 18:10:27 6479
原创 一步一步写算法(之prim算法 上)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面我们讨论了图的创建、添加、删除和保存等问题。今天我们将继续讨论图的一些其他问题,比如说如何在图的环境下构建最小生成树。为什么要构建最小生成树呢?其实原理很简单。打个比方,现在某一个乡镇有n个村,那么这n个村肯定是联通的。现在我们打算在各个村之间搭建网线,实现村村通的工程。
2011-11-04 23:04:58 6786 2
原创 一步一步写算法(之函数堆栈显示)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com 】 在继续图的讨论之前,我们今天开个小差,讨论一下函数堆栈的基本原理。有过编程经验的朋友都知道,堆栈调试是我们在程序开发中经常应用的一个功能。那么大家有没有想过,函数堆栈是怎么开始的啊?其实我们可以自己写一个函数堆栈输出函数分析一下。 因为一般来说,函数的压栈过程是这
2011-11-03 20:48:49 9825 9
原创 一步一步写算法(之图的保存)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面的几篇博客,我们对图进行基本定义,同时介绍了图的创建、图的添加和删除等。今天,我们聊一聊图是怎么在存储在外设中的。这些外接设备可以是各种类型的,比如说,可以是硬盘、sd卡、网络硬盘等等。本质上说,我们今天讨论的主题就是怎么把图的数据永久地保留在本地。并且,如果需要加载这些
2011-11-02 19:35:39 6820
原创 一步一步写算法(之图添加和删除)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面我们谈到的图的数据结构、图的创建,今天我们就来说一说如何在图中添加和删除边。边的添加和删除并不复杂,但是关键有一点需要记住,那就是一定要在小函数的基础之上构建大函数,否则很容易出现错误。 一、边的创建 边的创建一般来说可以分为下面以下几个步骤:
2011-11-01 20:31:23 9260 8
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人