Модифицированный lua: Lua_close зависает в pthread

Из моего состояния 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 не выполняется. Для меня это означает, что Луа повесил трубку, пытаясь закрыть L2. Если я закомментирую lua_close, все хорошо, даже с утечкой памяти.

makethread!
makethread complete!
dumb thread!
dumb thread complete!

Но если я вызываю dumb_thread прямо из моего состояния L1,

static int calldirectly(lua_State *L1) {
  dumb_thread()
  return 0;
}

Все работает как положено, и у меня есть доступ к моему терминалу lua. Далее код в lua L1 работает.

Что я могу сделать, чтобы эта многопоточность работала?

1 ответ

Я забыл упомянуть нашу систему блокировки. Оказывается, наша модифицированная библиотека lua (liblua.so) использует глобальную переменную блокировки. Вызов lua_close естественным образом разблокирует эту переменную. Однако оба состояния L1 и L2 совместно используют одну и ту же блокировку.

Решение состоит в том, чтобы просто создать отдельные переменные блокировки для каждого состояния lua.

К сожалению...

Другие вопросы по тегам