Модифицированный 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.
К сожалению...