从我的lua状态L1中,我调用了我注册的c函数makethread。

static int makethread(lua_State *L1) {
  printf("makethread!\n");

  pthread_t thread2;
  pthread_create( &thread2,NULL,dumb_thread,NULL);

  printf("makethread complete!\n");
  return 0;
}

哪个试图运行这个dumb_thread
void * dumb_thread() {
  printf("dumb thread!\n");

  lua_State * L2;
  L2= luaL_newstate();
  lua_close(L2);

  printf("dumb thread complete!\n");
  return 0;
}

看起来程序已完成,但由于lua_close而导致程序冻结。所有的打印语句都会触发,但是我再也无法控制lua终端了。另外,尽管说makethread完成了,但我的L1 lua状态下的其他代码没有运行。对我来说,这表明lua已挂断以尝试关闭L2。如果我注释掉lua_close,即使内存泄漏也一切都很好。
makethread!
makethread complete!
dumb thread!
dumb thread complete!

但是,如果我直接从我的L1状态调用dumb_thread,
static int calldirectly(lua_State *L1) {
  dumb_thread()
  return 0;
}

一切都按预期进行,我可以使用lua终端了。 lua L1中的其他代码可以正常工作。

我该怎么做才能使多线程工作?

最佳答案

我忽略了提及我们的锁定系统。事实证明,我们修改后的lua库(liblua.so)使用了全局锁定变量。调用lua_close自然会解锁此变量。但是,L1和L2状态都共享相同的锁。

解决方案是为每个lua状态简单地创建单独的锁定变量。

糟糕...

关于c - 修改过的lua : Lua_close freezes in pthread,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32322546/

10-10 08:00