欢迎访问 Lu程序设计
对Lu模块进行加锁
1 说明
要演示本文的例子,你必须下载Lu32脚本系统。本文的例子需要lu32.dll、lu32.lib、C格式的头文件lu32.h,相信你会找到并正确使用这几个文件。
用C/C++编译器创建一个控制台应用程序,复制本文的例子代码直接编译运行即可。
2 为什么对模块进行加锁
Lu支持表达式(函数)的模块化编译。参考Lu编程指南中的函数LuCom,该函数有一个参数nModule,要求给该表达式指定一个模块号,模块号用整数进行标识。如果用模块加锁函数LockModule对一个模块号进行了加锁,则编译表达式时必须提供加锁函数,本文专门讨论加锁函数LockModule。
为什么对一个模块进行加锁呢?假设你的C/C++程序是一个较复杂的系统,有多个线程在互斥共享使用Lu脚本系统(实用程序OpenLu就是这样的一个程序)。设线程1使用Lu模块1,线程2使用Lu模块2。则很自然地,线程1不希望线程2再使用Lu模块1,线程2也不希望线程1再使用Lu模块2。如果线程1和线程2都是你自己设计的,你很负责地进行了管理,似乎也没什么问题(实际上还是有问题的,也许其他你未知的线程会使用你的模块)。但如果这个C/C++程序允许线程1和线程2由不同的人进行设计,更一般的情况是,线程1和线程2可能相互并不知道对方的存在,那么它就无法保证自己的Lu模块不被其他线程使用;此时,如果有共同定义的模块变量,就会发生混乱,或者你会莫名其妙地发现,你的私有函数无法得到正确的编译。这时,你就会想到要对你使用的Lu模块加锁,仅供自己使用。
3 代码
#include <stdio.h> #include "lu32.h" #pragma comment( lib, "lu32.lib" ) void _stdcall NullLock1(void){}; //加锁模块的函数定义 int kkk; void _stdcall NullLock2(void){kkk=0;}; //加锁模块的函数定义。注意NullLock1和NullLock2定义上的区别,以告诉C/C++编译器,这的确是两个不同的函数。 void main(void) { void *hFor; //存放表达式句柄,即脚本函数句柄 luINT nPara; //存放表达式的自变量个数 LuData *pPara; //存放输入自变量的数组指针 luINT ErrBegin,ErrEnd; //表达式编译出错的初始位置和结束位置 int ErrCode; //错误代码 wchar_t For1[]=L"f(x,y)=x+y"; //字符串表达式,包含一个Lu脚本函数定义 wchar_t For2[]=L"g(x,y)=x-y"; //字符串表达式,包含一个Lu脚本函数定义 luVOID nModule=12321; //模块号,将要对此模块进行加锁。32位平台上,luVOID被定义为__int32。 if(!InitLu()) return; //初始化Lu //使用加锁函数NullLock1对模块nModule进行加锁,本例会成功加锁。如果不成功(该模块号已被加锁),尝试对其他模块号加锁,直至成功 if(LockModule(nModule,NullLock1,1)) { printf("成功加锁模块: %d \n",nModule); } ErrCode=LuCom(For1,nModule,0,NullLock1,&hFor,&nPara,&pPara,&ErrBegin,&ErrEnd); //编译表达式For1,使用正确的加锁函数NullLock1 if(ErrCode) { printf("编译表达式For1时有错误!错误代码: %d \n",ErrCode); } else { printf("表达式For1编译成功!\n"); } ErrCode=LuCom(For2,nModule,0,NullLock2,&hFor,&nPara,&pPara,&ErrBegin,&ErrEnd); //编译表达式For2,使用错误的加锁函数NullLock2 if(ErrCode) { printf("编译表达式For2时有错误!错误代码: %d \n",ErrCode); } else { printf("表达式For2编译成功!\n"); } LockModule(nModule,NullLock1,0); //对模块nModule进行解锁 FreeLu(); //释放Lu }
运行结果:
成功加锁模块: 12321
表达式For1编译成功!
编译表达式For2时有错误!错误代码: -2
4 函数说明
本例用到了Lu的4个输出函数:初始化Lu的函数InitLu,释放Lu的函数FreeLu,编译表达式的函数LuCom、加锁函数LockModule。从这里查看这些函数的说明:Lu编程指南。
5 难点分析
本例没有使用多线程进行实战演练,仅在单线程中演示了加锁函数LockModule的用法。估计你能理解,这应用于多线程的复杂系统是没有任何问题的。
6 其他
你可能注意到了,我的联系方式就在下面,如有不明之处或有什么建议,可随时与我进行联系。
版权所有© Lu程序设计 2002-2013,保留所有权利
E-mail: forcal@sina.com QQ:630715621
最近更新: 2013年12月23日