c程序中使用lua5.3.2库来实现程序与lua脚本的调用,设计概要:
1. 多线程调用lua的接口来实现对lua脚本的调用
2. 多线程调用system实现其他任务
这样做概率性的会出现程序死锁问题,下面是部分的堆栈信息:
Thread 8 (Thread 0x7f7ae46f0700 (LWP 14392)):
#0 0x00007f7b7ab03d1c in __lll_lock_wait_private () from /lib64/libc.so.6
#1 0x00007f7b7aa7653d in _L_lock_121 () from /lib64/libc.so.6
#2 0x00007f7b7aa74103 in __GI__IO_un_link () from /lib64/libc.so.6
#3 0x00007f7b7aa6611d in fclose@@GLIBC_2.2.5 () from /lib64/libc.so.6
#4 0x000000000046b2db in io_fclose ()
#5 0x000000000045c1dc in luaD_precall ()
#6 0x00000000004665a5 in luaV_execute ()
#7 0x000000000045c59c in luaD_call ()
Thread 4 (Thread 0x7f7ae26ec700 (LWP 14396)):
#0 0x00007f7b7ab03d1c in __lll_lock_wait_private () from /lib64/libc.so.6
#1 0x00007f7b7aa76640 in _L_lock_4452 () from /lib64/libc.so.6
#2 0x00007f7b7aa75a08 in _IO_flush_all_lockp () from /lib64/libc.so.6
#3 0x000000000046ba63 in io_popen ()
Thread 181 (Thread 0x7f7b3af9d700 (LWP 14197)):
#0 0x00007f7b7ab03d1c in __lll_lock_wait_private () from /lib64/libc.so.6
#1 0x00007f7b7aa76728 in _L_lock_6097 () from /lib64/libc.so.6
#2 0x00007f7b7aa7647f in __GI__IO_list_lock () from /lib64/libc.so.6
#3 0x00007f7b7aabd087 in fork () from /lib64/libc.so.6
#4 0x000000000044a302 in systemEx
经过定位,io_popen调用了l_popen
#define l_popen(L,c,m) (fflush(NULL), popen(c,m))
问题就在这句 fflush(NULL),这是这个操作导致了死锁
长风秋雁
相关分类