代码改变世界

(转)换行符 和 文件结束符EOF

2012-11-09 00:13 by kennyMc, 684 阅读, 0 推荐, 收藏,
摘要:文本方式和二进制方式的最大区别在于文本方式对于''\n''换行符的理解不同(1)在DOS平台下,该字符会被展开成<CR>< LF>两个控制字符(相当于"\r\n"),在ASCII字符集下是0DH,0AH(2)在UNIX平台下,仅仅是<LF>,不会展开。(3)在二进制方式下,不管是什么平台,''\n''都是精确的<LF>。关于EOF: EOF可以作为文本文件的结束标志,但不能作为二进制文件的结束符.feof函数既可以判断二进制文件,又可以判断文本文件.在window 阅读全文

windows线程用户模式-关键段

2012-11-07 23:17 by kennyMc, 407 阅读, 0 推荐, 收藏,
摘要:旋转锁和通过不断检测变量值来进行同步的方式都是占用CPU资源的方式,不推荐使用。假如同步变量不被修改,那么其中一个等待线程会一直执行。volatile关键字,在多线程方法里面经常看见带这个关键字的参数,大概理解了下,编译器可能对代码进行优化,把变量的值载入寄存器中,访问寄存器的值比字节访问内存地址中的值快,但是变量可能被其他不明的操作修改了值,导致寄存器中的值和内存地址中的值不同,volatile可以保证每次都从内存地址取值。之前的旋转锁的BOOL变量就没有加volatile关键字,给InterlockedExchange方法传入的是变量的地址,那么函数就会内存中读取值,编译器不会对此进行优化 阅读全文

windows线程同步-原子操作-Interlocked系列函数(用户模式)

2012-11-02 00:18 by kennyMc, 9908 阅读, 0 推荐, 收藏,
摘要:Interlocked系列函数用来保证原子访问。InterlockedExchangeAdd提供保证long类型的原子操作。InterlockedExchangeAdd64提供long long 64位的原子操作。搞不懂为什么不提供int类型的,int类型转换成long类型就是2个不同内存地址的变量,再来对long类型进行原子操作也就没用了?(这里请教了下c++网友,说是vs2010对类型检查很严格,可能之前的编译器也许会放松点?)int类型要进行原子操作只能强转为long指针了static int l=0;unsigned __stdcall ThreadFun(void* par){ .. 阅读全文

const函数

2012-11-01 18:05 by kennyMc, 269 阅读, 0 推荐, 收藏,
摘要:c++中函数后面加const表示函数内部不能修改类的成员,试过传入参数到函数,然后内部修改是可以的。#include <cstdlib>#include <iostream>using namespace std;class Man{ public: char* name; int age; Man(char* _name,int _age) { name=_name; age=_age; } void Show(int* a) con... 阅读全文

渐进符号

2012-10-30 00:53 by kennyMc, 6280 阅读, 1 推荐, 收藏,
摘要:分析算法时间复杂度时,把注意力集中到关键的操作上。几种渐进符号大写O符号f(n)=O(g(n)),这里f(n)是分析出来算法的执行次数的函数,O的定义:当且仅当存在正的常数c和n0,使得对于所有的n>=n0,有f(n)<=cg(n)。这里cg(n)就是函数f(n)的上限。几种函数的例子:1.线性函数f(n)=3n+2,当n>=2时,3n+2<=3n+n=4n。所以f(n)=O(n),这里c就是4,n0=2。2.平方函数f(n)=2n^2+3n+3,当n>=3时,3n+3<=4n,当n>=4时,4n<n^2,f(n)=2n^2+n^2=3n^2。f 阅读全文

CRITICAL_SECTION临界区

2012-10-21 22:06 by kennyMc, 321 阅读, 0 推荐, 收藏,
摘要:CRITICAL_SECTION不是核心对象,它是用一块共享资源来处理线程同步。线程同步方式很多,之间的区别和分类可以查阅windows核心编程和clr。#include <iostream>#include <process.h>#include <windows.h>using namespace std;//临界区CRITICAL_SECTION lock_cs;//这里如果不锁定,那么2个线程同进进入方法,可能出现几种输出情况//而我们期待的是同时只有一个线程对变量i进行操作。unsigned __stdcall ThreadFun(void* pa 阅读全文

WaitForSingleObject

2012-10-15 14:17 by kennyMc, 4591 阅读, 0 推荐, 收藏,
摘要:hHandle对象句柄。可以指定一系列的对象,如Event、Job、Memory resource notification、Mutex、Process、Semaphore、Thread、Waitable timer等。当核心对象有2个状态:激发,未激发,方法返回值:1:在等待核心对象期间,对象变为激发状态,返回WAIT_OBJECT_02:核心对象变成激发状态之前,等待时间结束,返回WAIT_TIMEOUT3:如果线程没有释放mutex,返回WAIT_ABANDONED#include <iostream>#include <windows.h> using name 阅读全文

windows线程创建

2012-10-11 15:03 by kennyMc, 394 阅读, 0 推荐, 收藏,
摘要:ws中,线程是从所在进程的4GB地址空间中分配自己的栈。 线程内创建的局部变量都是在线程的栈上,静态或全家变量多个线程可以访问,容易破坏数据。 重要的一个知识点:线程的上下文context结构 之前在clr c#中看过,但是没有认真看,每个线程都有一组自己的CPU寄存器,叫做线程的上下文。 context结构保存了进程上次执行时CPU的寄存器状态。 当线程被调度到使用CPU时,系统用线程的上下文来初始化CPU的寄存器,其中一个CPU寄存器保存了 线程要执行的下一条CPU指令的地址,CPU寄存器中还有一个执行线程的栈地址的指针。#include <iostream>#includ.. 阅读全文

Unicode宽字符

2012-10-10 15:39 by kennyMc, 304 阅读, 0 推荐, 收藏,
摘要:Unicode使用UTF-16编码(双字节)。当UTF-16不足以表示某个字符,UTF-16支持使用代理(32位4个字节)来表示一个字符。UTF-8将字符编码表示为1-4个字节,具体看字符的编码大小,对于0x0080以下的字符压缩为1个字符,当对>=0x0080的大量字符进行编码的效率不如UTF-16。UTF-32就不用多讲了,效率不如前面的。UTF系列相当于Unicode的再编码。#include <iostream>#include <windows.h>using namespace std;int main(){ TEXT() wchar_t str[]= 阅读全文

CreateFile创建文件

2012-10-09 15:02 by kennyMc, 7761 阅读, 0 推荐, 收藏,
摘要:#include <iostream>#include <windows.h>using namespace std;int main(){ char text[]="Stupid Japanese"; DWORD dwBytesWritten =0; //详细参考:http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx //或者《windows核心编程》 HANDLE hFile;//文件句柄 hFile=CreateFile( "C:\ 阅读全文