使用线程来执行任务

围绕任务执行来组织程序的第一步是辨识合理的任务边界。理想情况下,任务是独立的活动:不依赖其他任务状态、结果或副作用的工作。独立性使得并发变得容易,因为在处理资源足够的前提下,独立任务可以并发执行。为了在调度上有更大的灵活度和加载平衡任务,每一个任务代表着应用程序处理能力的一个小片段。 服务端应用程序应该在正常加载情况下同时兼备好的吞吐量和好的响应能力。应用程序提供方想要让应用程序尽可能地支持更多的用户,以便减少单用户供应成本;用户希望能够得到快速的响应。而且,当应用程序过载后会变得功能退化,而不是在在重负荷情况下瘫痪。选择合适的任务边界及合理的任务执行策略可以帮助实现这些目标。 大多数服务端应用程序为任务边界提供了一个默认选择,就是单客户端请求。web服务器,邮件服务器,文件服务器,EJB容器和数据库服务器都接受来自远程客户端通过网络连接发来的请求。将单客户端请求作为任务边界,通常既提供了独立性,又提供了合适的任务大小。比如说,给邮件服务器发送消息,并不受其他正在编写中的消息的影响,并且处理单独的消息通常需只需要极少的服务器存储容量。 在线程中执行任务有两种方式:一种是在单线程中顺序执行任务,一种是为每一个任务创建一个线程进行处理。 1. 在单线程中顺序执行任务 import java.util.ArrayList; import java.util.List; public abstract class SingleThreadRenderer {...

12 分钟前

Registry的使用

介绍 Registry是一个位于伪索引LUA_REGISTRYINDEX处的全局table,确切的说,是一个常规table(也就是说,它没有元表) 伪索引和栈中的索引相似,不同的是,与伪索引关联的值并不在栈中。 Lua API中大多数接受索引作为参数的函数,也接受伪索引作为参数。 说明: 1.由于所有的C模块共享相同的registry,所以在挑选key的时候要特别小心,避免名称冲突。 使用字符串作为键值,在我们希望其他独立库访问我们数据的时候很有用。在选择字符串作为键的时候,建议不要使用通用名称,且不要在名称前加上库的名字。 不要使用数字作为注册表的键,因为Lua会为其引用系统保留数字键。这个系统是有辅助库中的一对函数组成,允许我们在不需要担心怎样创建键的前提下存储值。注意,只有在我们需要将引用存储到C结构中的Lua值中时候,才会考虑使用引用。 int ref = luaL_ref(L, LUA_REGISTRYINDEX); 由于Lua没有提供任何指向table或function的指针类型,所以在需要访问这些对象的时候,可以使用引用,并将引用保存在C代码中。...

18 分钟前

Lua中的函数和闭包

当Lua编译一个函数的时候,会产生一个prototype,这个prototype包含了这个函数的虚拟机器指令、常量值和一些调试信息。 在运行的时候,任何时候,Lua执行一个function…end表达式的时候,会为这个函数创建一个新的闭包(closure)。 每一个闭包包含“两个引用和一个引用数组”: 对prototype的引用 对闭包环境的引用(这个环境是一个table,通过它可以查找全局变量) 对upvalue的引用构成的数组,可以通过这些引用来访问外部的local变量 词法作用域和一流函数的结合为对外部的local变量的访问带来的困难。 add函数 调用过程 function add (x) add2 = add(2)...

2 分钟前

存储C函数中的状态

在C语言中,我们经常使用全局(extern)或静态变量来保存非本地变量,以便这些变量可以在函数外被使用。 当我们在编写给Lua调用的C库函数时,定义全局或静态变量是不起作用的。 首先因为不能将Lua值保存在C变量中, 其次,使用这些变量的库函数对多个Lua状态不支持 Lua函数有两个地方可以存储非本地变量:全局变量和非本地变量。 CAPI提供了提供了两种相似的地方,用来存储非本地数据:Registry和Upvalues。 Registry Upvalues

1 分钟前

字符串操作-编写C函数技术(二)

规则 当C函数接受Lua中的字符串作为参数时,需要遵循两条规则: 1.使用字符串的时候,不需要将字符串弹出栈 2.不能修改字符串内容 字符串操作函数 字符串抽取——lua_pushlstring函数 要向栈中压入字符串s从i到j(包含)的子字符串,可以使用下面语句: lua_pushlstring(L, s+i, j-i+1) 例子 MYCLIBS_API int myclibs_split(lua_State *L)...

20 分钟前

数组操作-编写C函数技术(一)

lua中的数组,仅仅是一个以特殊方式使用的table。 可以使用操作table的方法lua_settable和lua_gettable来操作数组。但是也可以使用下面的方法来访问和更新数组中的元素值。 void lua_seti(lua_State *L, int index, int key) void lua_geti(lua_State *L, int index, int...

3 分钟前