自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 Lua中的线程和状态

线程(thread)作为Lua中一种基本的数据类型,它代表独立的执行线程(independent threads of execution),线程类型是实现协程(coroutines)的基础。本文将介绍Lua虚拟中的全局状态和线程的关系,以及从源码角度来看其数据结构。

2015-05-30 20:19:10 10094

原创 Lua中Userdata类型源码实现

1、概述    Lua中userdata分两种,一种是轻量级userdata(light userdata),轻量级userdata是一种表示C指针的值,对Lua虚拟机来说,这种数据类型不需要GC(垃圾回收),其指向的内存由用户分配和释放,其实现就是一个void *p指针;后一种userdata类型完全userdata(full userdata),内存是由Lua虚拟机分配,并有GC机制负责处

2015-04-15 19:22:53 3772

原创 Lua中table类型的源码实现

1、概述table是lua中唯一的表示数据结构的工具。它可以用于实现数据容器、函数环境(Env)、元表(metatable)、模块(module)和注册表(registery)等其他各种用途。因此了解table的实现是非常有必要的,根据《Lua中数据类型的源码实现》中知道,在Lua中,table是由结构体体Table来实现的。下面将以Lua 5.2.1的源码来看table的实现。2、实现原

2015-04-14 20:25:37 4578

原创 Lua中编译执行代码相关的函数以及机制

可以说Lua之所以称为是一种解释型的语言,正是因为有诸如load这样的函数,因为这样的函数使得Lua可以执行动态生成的代码。下面具体来分析这些函数。load函数load函数原型如下:load (chunk [, chunkname [, mode [, env]]]) 该函数加载一个chunk,如果没有错误,则返回一个函数。如果传入chunk的值是一个字符串,则就加载这个字符串;如果传

2015-04-09 19:15:40 2109

原创 浅析线程间通信三:Barriers、信号量(semaphores)以及各种同步方法比较

之前的文章讨论了互斥量、条件变量、读写锁和自旋锁用于线程的同步,本文将首先讨论Barriers和信号量的使用,并给出了相应的代码和注意事项,相关代码也可在我的github上下载,然后对线程各种同步方法进行了比较。    Barriers    Barriers是一种不同于前面线程同步机制,它主要用于协调多个线程并行(parallel)共同完成某项任务。一个barrier对象可以使得每个

2015-04-02 21:03:15 3056

原创 Lua中字符串类型的源码实现

概述    Lua完全采用8位编码,Lua字符串中的字符可以具有任何数值编码,包括数值0。也就是说,可以将任意二进制数据存储到一个字符串中。Lua的字符串是不可变的值(immutable values)。如果修改,实质上是新建一个字符串。根据《Lua中数据类型的源码实现》中知道,在Lua中,字符串是自动内存管理机制所管理的对象,并且由联合体TString来实现存储字符串值的。下面将通过Lu

2015-03-31 21:57:47 2892

原创 Lua中数据类型的源码实现

概述    在Lua中有8种基础类型:nil、boolean、number、string、userdata、function、thread和table。可以使用函数type查看某个变量或值的类型,返回相应的类型名称。像其他动态语言一样,在语言中没有类型定义的语法,每个值都携带了它自身的类型信息。下面将通过Lua 5.2.1的源码来看类型的实现。   源码实现     Lua将值表示

2015-03-30 19:36:45 2599

原创 Lua中的模块以及实现方法

从使用的角度来看,一个模块就是一个程序库,可以通过Lua自身提供的require来加载。然后便得到一个全局变量,表示一个table。这个table就是像一个名字空间,其内容就是模块导出的所有东西,例如函数和常量。简单的说,Lua中的模块就是一个table,table中可以包括任何东西。本文首先详细介绍模块相关的require函数,包括该函数的执行流程以及查找模块的路径,然后介绍了实现模块的三种方法

2015-03-29 16:12:39 4905

原创 Lua中类的实现

概述     一个类就是像是一个创建对象的模具,对于Lua这种没有类的概念的语言,为了模拟类,方法是为要创建的对象制定一个原型(prototype)。这个原型相当于其他语言中的类。但是原型同时也是一种常规的对象,当其他的对象(看成是原型的实例)遇到一个未知的操作时,就会去原型中查找。因此,在Lua这种没有类的语言中,为了表示一个类,只需创建一个专用作其他对象的原型。类和原型都是一种组织对象间共

2015-03-28 20:49:26 1588

原创 深入理解Lua的闭包一:概念、应用和实现原理

本文首先通过的例子讲解了Lua中闭包的概念,然后总结了闭包的应用场合,最后探讨了Lua中闭包的实现原理。闭包的概念在Lua中,闭包(closure)是由一个函数和该函数会访问到的非局部变量(或者是upvalue)组成的,其中非局部变量(non-local variable)是指不是在局部作用范围内定义的一个变量,但同时又不是一个全局变量,主要应用在嵌套函数和匿名函数里,因此若一个闭包没有会

2015-03-15 20:25:28 23142 4

原创 浅析线程间通信二:读写锁和自旋锁

上文讨论了互斥量和条件变量用于线程的同步,本文将讨论读写锁和自旋锁的使用,并给出了相应的代码和注意事项,相关代码也可在我的github上下载。 读写锁 对于互斥量要么是锁住状态要么是不加锁锁状态,而且一次只有一个线程可以对其加锁,而读写锁对线程的读数据加锁请求和写数据加锁请求进行了区分,从而在某些情况下,程序有更高的并发性。对于读写锁,一次只有一个线程可以占有写模式的读写锁,但是多个线程可

2015-02-25 16:37:29 2005

原创 浅析线程间通信一:互斥量和条件变量

线程同步的目的简单来讲就是保证数据的一致性。在Linux中,常用的线程同步方法有互斥量( mutex )、读写锁和条件变量,合理使用这三种方法可以保证数据的一致性,本文将讨论互斥量和条件变量的使用,并给出了相应的代码和注意事项。

2015-01-03 19:57:00 3160

原创 浅析Linux线程调度

在Linux中,线程是由进程来实现,线程就是轻量级进程( lightweight process ),因此在Linux中,线程的调度是按照进程的调度方式来进行调度的,也就是说线程是调度单元。Linux这样实现的线程的好处的之一是:线程调度直接使用进程调度就可以了,没必要再搞一个进程内的线程调度器。在Linux中,调度器是基于线程的调度策略(scheduling policy)和静态调度优先级(st

2014-12-20 13:47:22 14324

原创 浅析Linux线程中数据

本文首先概述了线程中有哪些数据私有的,以及进程中哪些数据是线程共享的,然后详细分析了线程在用户空间中的数据,最后通过一个多线程程序来分析线程中的数据分布。

2014-12-03 20:42:23 1981

原创 浅析Linux线程的创建

本文首先使用了接口pthread_create创建一个线程,并用strace命令追踪了接口pthread_create创建线程的步骤以及涉及到的系统调用,然后讨论了Linux中线程与进程关系,最后概述了为了实现POSIX线程,Linux内核所做的修改。  使用pthread_create创建线程  在Linux下可以使用pthread_create来创建线程,该接口声明如下:#

2014-11-24 19:15:09 3023

原创 浅析C++绑定到Lua的方法

虽然将C++对象绑定到Lua已经有tolua++、LuaBridge和luabind等各种库可以直接使用,但弄清楚C++对象绑定到Lua的常见方法,不但有助于更深的了解Lua的机制,还可以方便修改第三方库以满足实际项目需求。本文通过分析第三方库Lunar的实现,来理解C++对象绑定到Lua的通常方法。

2014-11-06 19:52:49 4270 1

原创 浅析HTTP中POST和GET区别并用Python模拟其响应和请求

最近在几周在做手游崩溃信息收集和上传,拿到崩溃信息后,使用的是HTTP的POST方法上传到公司共用的服务器的,因此做简单总结如下。本文首先简单介绍了HTTP协议,主要说明了POST方法和GET方法的区别;然后用Python实现了 对POST方法和GET方法的响应;最后用Python模拟了POST方法和GET方法的请求。

2014-09-25 20:05:53 11075

原创 Cocos2d-x程序在Android下的启动过程

本文通过分析cocos2d-x自身提供的示例程序HelloLua来分析cocos2d-x程序在android平台下的具体启动过程。

2014-09-21 09:06:57 7064

原创 使用gcc时头文件路径和动态链接库路径

在使用gcc编译连接生成可执行文件时,经常会碰到变量未定义、链接时或者运行可执行文件时找不到相应的动态库等问题,本文首先介绍了gcc在编译时头文件路径相关选项以及搜索路径顺序,然后讨论了编译成可执行文件时动态库的搜索路径顺序,最后说明了生成可执行文件后,运行文件时动态库的搜索路径顺序。搞清楚这三个搜索路径,在用gcc碰到的未定义变量或搜索不到动态库的问题,基本上都可以解决了。头文件路径编译时相

2014-08-14 16:36:38 10062

原创 gcc的使用

gcc是Linux下常用的C/C++编译驱动器。本文首先介绍了gcc整个编译连接过程,然后讨论gcc常用的选项,最后说明了gcc与g++的关系。

2014-08-11 16:58:02 2088

原创 Linux/Unix分配进程ID的方法以及源码实现

在Linux/Unix系统中,每个进程都有一个非负整型表示的唯一进程ID。虽然是唯一的,但是进程的ID可以重用。当一个进程终止后,其进程ID就可以再次使用了。大多数Linux/Unix系统采用延迟重用的算法,使得赋予新建进程ID不同于最近终止进程所使用的ID,这主要是为了防止将新进程误认为是使用同一ID的某个已终止的先前进程。本文讨论了Linux/Unix分配进程ID的方法以及源码实现。

2014-05-31 14:06:11 3713

原创 深入理解Lua的全局变量_G以及源码实现

在Lua脚本层,Lua将所有的全局变量保存在一个常规的table中,这个table被称为全局环境,并且将这个table保存在一个全局变量_G中,文章首先通过一个递归函数,打印出_G中所有的信息,然后说明了怎么使用全局变量_G,最后从源码角度来看_G的实现

2014-04-19 13:53:29 13372 1

原创 用LuaBridge为Lua绑定C/C++对象

最近为了总结Lua绑定C/C++对象的各种方法、第三方库和原理,学习了LuaBridge库为Lua绑定C/C++对象,下面是学习笔记,实质是对该库的Reference Manual基本上翻译了一遍,学习过程中测试代码,放在我的github上。LuaBridge的主要特点     源码只有头文件,没有.cpp文件,没有MakeFile,使用时只需一个#include即可。     支

2014-03-31 20:57:05 8785 2

原创 用Lua实现插入、删除和查找时间复杂度为O(1)的集合

利用下面代码可以定义一个集合S,对该集合所有的操作,比如插入、删除元素和查找元素都是O(1),代码如下:function newset() local reverse = {} --以数据为key,数据在set中的位置为value local set = {} --一个数组,其中的value就是要管理的数据 return setmetatable(set,{__i

2014-03-27 19:34:27 4327

原创 深入理解Lua与C数据通信的栈

Lua与C交互的栈是一个重要的概念。文章首先解释了为什么要引入Lua栈,然后对访问栈常用的API进行了总结,并使用这些API的注意事项,最后从Lua源代码来看栈的实现原理。

2014-03-16 18:00:03 8627

原创 Lua学习笔记四之用C为Lua定义类型(UserData)

继续学习Lua与C交互,下面是在用C为Lua定义类型(UserData)的笔记以及自己的理解,其中学习过程中的写的测试代码都可以从我的github下载。     0、Lua中使用userdata类型来表示在C中定义的类型。userdata只是提供了一块原始的内存区域,可以用来存储任何东西,并且,在lua中userdata没有任何预定义的操作。在C中调用函数lua_newuserdata会根据指

2014-02-28 19:28:24 4587 1

原创 Lua学习笔记三之从Lua中调用C

继续学习Lua与C交互,下面是在学习Lua中调用C定义函数的笔记以及自己的理解,其中学习过程中的写的测试代码可以从我的GitHub下载。     0、对于能被Lua调用的C函数,必须注册这个C函数,以便用某种适当的方式将函数地址告诉Lua。当Lua调用C函数时,使用了与C调用Lua函数时相同的栈。C函数从栈中获取函数参数,并将结果压入栈中。为了在栈中将函数结果与其他值区分,C函数还

2014-02-27 19:39:32 2364

原创 Lua学习笔记二之C中调用Lua

虽然之前看过《Lua程序设计》(第二版)这本书,但对C与Lua交互的部分,一直不是很理解。最近想系统学习和深入理解C与Lua的交互(实质是想通过这个,进一步阅读Lua源码,:)),因此又看了一下这本书的第4部分,下面是在学习C中调用Lua的全局变量、table和函数的笔记以及自己的理解,其中学习过程中的写的代码可以从我的github下载。     0、Lua与C有两种交互形式。在第一种

2014-02-26 20:33:32 2147

原创 Lua源码剖析(lstrlib.c)

0、lstrlib.c模块是Lua字符库string的实现,读该模块源码是为了学习Lua与C的API以及注册方法。1、类似于math库,Lua用下面的的代码来注册string模块以及里面的接口:static const luaL_Reg strlib[] = { {"byte", str_byte}, {"char", str_char}, {"dump

2013-08-23 15:15:08 2441

翻译 Lua Faq翻译之为什么lua中没有类似于+=的操作符以及用Lua实现C++中的<<操作符

链接:http://lua-users.org/wiki/LuaFaq和http://lua-users.org/wiki/CustomOperators在实现lua时,目标之一就是简洁。大多数语言包括许多特性,这就意味着他们有许多复杂的特效,比如C++,pythoh,Lisp。很少语言像Forth和lua这样,语法简洁。lua目标是提供那些真正需要的原子特性,但如果需要,你可以利用这

2013-07-21 15:45:45 2814

翻译 Lua 5.2 手册翻译之元表和元方法(Metatables and Metamethods)

0、手册应该是学习语言的最好的文档,一边看文档,一边想把它记录下来,lua 5.2 英文手册地址:http://www.lua.org/manual/5.2/manual.html在lua中,任何值都可以拥有元表(metatable)。元表本质是就是lua中table,但同时通过元表可以自定义在某些值上的操作。通过设置元表中特定的域(fields)值,可以改变某些值的操作行为。比如,当非数值类

2013-07-20 16:53:44 1895

原创 Lua源码剖析(lmathlib.c)

0、该模块是Lua数学库math模块的实现,读该模块源码是为了学习Lua与C的API以及注册方法。1、当在Lua程序中,调用require("math")时,就会调用下面的luaopen_math函数,来注册函数库:     static const luaL_Reg mathlib[] = {       {"abs",   math_abs},       {"acos",

2013-06-09 15:19:52 2521

原创 在Win下安装Vim插件总结

0、为了在Win下查看和修改客户端代码,而习惯了用Vim,自然就需在Win搭建Vim以及相关的插件。大部分是按照网上的一篇文章《gvim配置及相关插件安装(过程详细,附图)》来做的,链接地址如下:http://blog.csdn.net/songjinshi/article/details/7261741。但在按照插件grep.vim,碰到了一些问题,故记录之。     1、注意win

2013-05-01 21:03:41 1307

原创 文件的特殊权限:SUID、SGID和SBIT学习笔记

零、下面是学习这个三个特效权限的总结,并分三个部分来分别介绍他们。     一、SetUID          (1)为什么引入SetUID?          考虑下面一种情形,我们知道在Linux系统中,所有的账号密码都记录在/etc/shadow这个文件中,这个文件的权限为-rw-r----- 1 root shadow,也就是说只有root用户才能修改这个文件,但是我们

2013-03-15 20:28:08 1630

原创 《Linux命令行与Shell脚本编程大全》学习笔记4

0、下面是书本第五章的学习笔记,并且只记录那些,本人认为重要的、不知道的抑或遗忘的内容。     1、Linux系统使用一个专门的文件来讲用户的登录名匹配到对应的UID值。这个文件就是/etc/passwd文件,它包含了一些与用户相关的信息。Linux系统会为各种各样的功能创建不同的用户账户,而这些账户并不是真的用户。这些账户称作系统账户,是系统上运行的各种服务进程访问资源用的特殊账户

2013-03-12 22:44:39 1052

原创 《Linux命令行与Shell脚本编程大全》学习笔记3

0、下面是书本第五章的学习笔记,并且只记录那些,本人认为重要的、不知道的抑或遗忘的内容。     1、在bash shell中,环境变量分为两类:全局变量,局部变量。全局环境变量不仅对shell会话可见,对所有shell创建的子进程也可见。局部变量则只对创建它们的shell可见。这让全局环境变量对那些子进程中需要获取父进程信息的程序来说非常有用。可以命令printenv 查看Linux

2013-02-28 23:02:29 1118

原创 《Linux命令行与Shell脚本编程大全》学习笔记2

0、下面是书本第四章的学习笔记,并且只记录那些,本人不知道的抑或遗忘的内容。     1、命令ps,Linux系统中使用的GNU ps命令支持3个不同类型的命令行参数:Unix风格的参数,前面加单破折线;BSD风格的参数,前面不加破折线;GNU风格的长参数,前面加双破折线。参数-e显示所有的进程,-f显示完整格式的输出,因此想查看系统上运行的所有进程,可以用-ef;-H参数能把输出的进

2013-02-24 18:54:06 840

原创 《Linux命令行与Shell脚本编程大全》学习笔记1

0、下面是书本第三章的学习笔记,并且只记录那些,本人不知道的抑或遗忘的内容。     1、默认情况下,bash shell启动时会自动处理用户主目录下.bashrc文件中的命令。许多Linux发行版在此文件中加载特殊的共用文件,在共用文件中保存着针对所有系统用户的命令和设置。通常该文件设置各种应用程序中用到的环境变量。     2、有两个环境变量是用来控制命令行提示符的格式

2013-02-24 18:53:20 924

原创 svn diff与vim整合

0、起因     大家知道,如果我们直接用svn diff,显示内容不如vimdiff直观,加上最近跟我一起住的同学,也在鼓吹,把svn加到自己的vim,有多方便,因此花了一点点时间,google相关资料,整理如下。1、svn diff命令替换为vimdiff     操作步骤如下:          1、首先在~/bin下创建一个shell脚本,例如名字为svndiff.

2013-02-21 20:17:01 2001 2

原创 Lua基础学习(一)

1、可以将一个table想象成一种动态分配的对象,程序仅仅持有一个对他们的引用(或指针),Lua不会暗中产生table的副本或创建新的table。table永远是匿名的(anonymous),一个持有table的变量与table自身没有固定的关联性。感觉与python完全类似。     Lua中怎么分配一块大的连续的数组,只用语言本身。table.insert不行。     table

2013-01-14 21:03:53 4610 4

提示
确定要删除当前文章?
取消 删除