2015-09-01 63 views
3

從我的lua狀態L1中,我調用了我註冊的c函數makethread。修改後的lua:Lua_close凍結在pthread中

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中的其他代碼有效。

我可以做些什麼來使這個多線程工作?

回答

2

我忽略提及我們的鎖定系統。原來我們修改過的lua庫(liblua.so)使用了一個全局鎖定變量。調用lua_close自然會解鎖這個變量。但是,L1和L2州共享同一個鎖。

解決方案是簡單地爲每個lua狀態創建單獨的鎖定變量。

抱歉...

+4

也許你想編輯您的問題的標題表明,這是關於修改的Lua,不遺餘力別人,如果他們有類似的問題的答案不是對他們有用的失望。否則刪除問題。 – llogiq