luajit/physicsfs 互斥锁死锁问题
2015-2-13 12:1:52
收藏:0
阅读:95
评论:1
我有以下代码:
local M=ffi.load "physfs"
ffi.cdef [[ //basically the preprocessed content of physfs.h, see http://icculus.org/physfs/docs/html/physfs_8h.html ]]
M.PHYSFS_init(arg[0])
M.PHYSFS_setSaneConfig("a","b","zip",0,0)
function file2str(path)
local cpath=ffi.cast("const char *",path)
print(1) --debug
if M.PHYSFS_exists(cpath)==0 then return nil,"file not found" end
print(2) --debug
-- some more magic
end
assert(file2str("someFile.txt"))
在调用时,我期望得到调试输出1和2,或者至少触发断言,但我只得到:
1
["endless" (i pressed ^C after about a minute) freeze]
当最终让 luajit 在 gdb 中运行时,冻结时的回溯如下:
(gdb) bt
#0 0x00007ffff37a5c40 in __pause_nocancel ()
at ../sysdeps/unix/syscall-template.S:81
#1 0x00007ffff379bce6 in __pthread_mutex_lock_full (mutex=0x68cbf0)
at ../nptl/pthread_mutex_lock.c:354
#2 0x00007ffff606951f in __PHYSFS_platformGrabMutex (mutex=0x68cbf0)
at /home/kyra/YDist/src/physfs-2.0.3/platform/unix.c:403
#3 0x00007ffff606410d in PHYSFS_getWriteDir ()
at /home/kyra/YDist/src/physfs-2.0.3/physfs.c:913
#4 0x000000000045482b in ?? ()
#5 0x000000000043a829 in ?? ()
#6 0x000000000043af17 in ?? ()
#7 0x00000000004526a6 in ?? ()
#8 0x0000000000446fb0 in lua_pcall ()
#9 0x00000000004047dc in _start ()
所以对我来说,似乎有些东西阻止了互斥锁,这有点奇怪,因为虽然有两个线程在运行,但只有一个线程甚至触及 physfs(第二个线程甚至没有 'ffi.load "physfs"')
我应该怎么做?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
我仍然不知道到底发生了什么,但在尝试在gdb中进一步调试互斥锁时,我将
libpthread.so预加载到gdb进程中,然后它突然可以工作了。之后,我尝试将其预加载到没有gdb的luajit中,也能正常工作。
然后我进一步研究了physfs和lualanes(这是我用于线程的pthread ffi包装器),发现如果尚未加载,则两者都尝试加载
libpthread,但是physfs是从C语言,而lualanes则使用ffi加载,其某种方式无法看到由physfs加载的版本,进程最终会加载两个库的副本。因此,解决方法是在
ffi.load“physfs”之前显式执行ffi.load“pthread”,因为虽然lanes看不到由physfs加载的版本,但physfs只能使用我们加载的版本,不会再次尝试加载它,而luajit ffi会忽略lanes进行的进一步加载尝试。