对Lu模块进行加锁

欢迎访问 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日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值