本示例采用Lua5.3.4版本(没有在全局state中加锁,可能向_G变量插入元素时会有多线程问题,后续测试有问题再修改,先记录一下,只在lua_State中定义锁,是为了实现每条线程创建独立的对应的lua_State,防止多线程间全局锁互相等待)
1.修改lua_State结构体
src/lstate.h
修改global_State结构体,加上线程锁对象(用递归锁防止出现重复锁问题):
pthread_mutexattr_t lock_attr_;
pthread_mutex_t lock;
2.初始化锁对象
src/lstate.c
修改函数preinit_thread末尾添加锁对象初始化代码:
pthread_mutexattr_init(&g->lock_attr_);
pthread_mutexattr_settype(&g->lock_attr_, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&g->lock, NULL);
3.释构锁对象
src/lstate.c
修改函数close_state,在freestack(L);语句后面添加如下代码:
lua_unlock(L);
pthread_mutex_destroy(&g->lock);
4.修改lua_lock和lua_unlock宏
src/llimits.h
修改lua_lock和lua_unlock宏:
#define lua_lock(L) pthread_mutex_lock(&(G(L)->lock));
#define lua_unlock(L) pthread_mutex_unlock(&(G(L)->lock));
5.修改完lua的源码后,编译lua源码(在centos系统环境下编译):
make linux
make linux install
编译完成后,会在/usr/local/include下存放相关的头文件,在/usr/local/lib下存放liblua.a库文件