Multithreading 多线程实现中的bug
请帮我找到多线程实现中的一个bug 我试图通过一个钩子实现多线程,经过n次迭代后,钩子会发送到堆栈lua_yield(L,0);,它挂起主线程,将控制权让给第二个线程。 foo函数从main函数的主线程循环运行一次,这是一个循环,当在foo函数中调用yield()函数时,它将控制权交给主线程(main函数),然后在n次之后打开钩子挂起主线程(main函数),将控制权交给第二个线程(foo函数)。在主线程的第150次迭代之前,一切都进展顺利。帮助了解错误在哪里Multithreading 多线程实现中的bug,multithreading,api,lua,Multithreading,Api,Lua,请帮我找到多线程实现中的一个bug 我试图通过一个钩子实现多线程,经过n次迭代后,钩子会发送到堆栈lua_yield(L,0);,它挂起主线程,将控制权让给第二个线程。 foo函数从main函数的主线程循环运行一次,这是一个循环,当在foo函数中调用yield()函数时,它将控制权交给主线程(main函数),然后在n次之后打开钩子挂起主线程(main函数),将控制权交给第二个线程(foo函数)。在主线程的第150次迭代之前,一切都进展顺利。帮助了解错误在哪里 static int timerfi
static int timerfirsttread = 0;// таймер для первого потока.
void LUAHook(lua_State* L, lua_Debug* ar) {
timerfirsttread++;
if (timerfirsttread > 8) {
timerfirsttread = 0;
lua_yield(L, 0);
}
};
int my_yield(lua_State* L) {
int args = lua_gettop(L);args++;
lua_State* L1 = lua_newthread(L);
lua_pushthread(L1);
return lua_yield(L, args);/* Когда функция C вызывает lua_yield таким
образом, запущенная сопрограмма приостанавливает
свое выполнение, и вызов lua_resume этой запущенной процедуры
возвращается.*/
};
int yield(lua_State* L) {return lua_yield(L, 0);/* Параметр res - это
число значений из стека,
которые передаются как результаты lua_resume.*/
};
const char* LUA = R"(
function foo(x) x = x or 3
print(" func foo "..x.. " \n")
for i = 1, x do
print(" func foo "..i.."\n")
yield()
end
end
function main()
for i = 1, 3220000 do
z=i*6
print(" func main "..i.."\n")
if i ==1
then my_yield(foo,10000036)
end
end end
)";
int main(int argc, char* argv[]) {
lua_State* L = luaL_newstate();/*Функция создает новое Lua состояние.
Она вызывает lua_newstate с функцией-*/
luaL_openlibs(L); lua_State* L1 = NULL;
lua_register(L, "my_yield", my_yield);
lua_register(L, "yield", yield);
cout << "\n"; checkerror(L, LUA);
lua_getglobal(L, "main");
lua_resume(L, NULL, 0); /* Запускает и продолжает сопрограмму в данном
потоке L. */
L1 = lua_tothread(L, -1); lua_pop(L, 1); lua_xmove(L, L1,
lua_gettop(L));lua_remove(L1, 1);
int args = lua_gettop(L1);// cout << args << endl;// Аргументы.
for (int i = 1; i > args; i++) {lua_pushvalue(L1, i);}
args--; lua_resume(L1, L, args); lua_xmove(L, L1, 1); //showstack(L1);
while ( LUA_OK != lua_status(L)) { // пока поток main не завершен.
if (LUA_YIELD == lua_status(L1)) {// если поток 2 на паузе.
lua_sethook(L, LUAHook, LUA_MASKCOUNT, 6);//Пауза после 6 итерации.
lua_resume(L, L1, 0);
}// main
if (LUA_YIELD == lua_status(L)){// если поток main на паузе.
lua_sethook(L, LUAHook, LUA_MASKCOUNT, 0);// отключить хук.
lua_resume(L1, L, 0);// foo
}
if (LUA_OK == lua_status(L1)) {// если поток foo завершен.
lua_sethook(L, LUAHook, LUA_MASKCOUNT, 0);// отключить хук.
lua_resume(L, NULL, 0);
}
if (LUA_OK == lua_status(L)) { break; }// если поток main завершен.
};
lua_close(L);
return 0;
};
static int timerfirsttread=0;//таймер для первого потока.
void LUAHook(lua_State*L,lua_Debug*ar){
timerfirsttread++;
如果(TIMERFIRSTREAD>8){
timerfirsttread=0;
卢厄产量(L,0);
}
};
int my_产量(lua_州*L){
int args=lua_gettop(L);args++;
lua_State*L1=lua_新线程(L);
lua_推丝(L1);
返回luaаU收益率(L,args);/*БПаафааCзааааааааluaаU收益率
образом, запущенная сопрограмма приостанавливает
恢复,恢复,恢复
возвращается.*/
};
整数收益率(lua_状态*L){返回lua_收益率(L,0);/*Паааааа
число значений из стека,
恢复*/
};
常量字符*LUA=R“(
函数foo(x)x=x或3
打印(“func foo”.x…“\n”)
对于i=1,x do
打印(“func foo.”i…“\n”)
收益率()
结束
结束
函数main()
对于i=13220000 do
z=i*6
打印(“func main”.i…“\n”)
如果i==1
然后我的收益率(foo,1000036)
结束
结束
)";
int main(int argc,char*argv[]){
lua_State*L=luaL_newstate()/*Фзззззззззззззза。
新闻状态-*/
lua_openlibs(L);lua_State*L1=NULL;
lua_寄存器(L,“我的收益率”,我的收益率);
lua_寄存器(L,“收益率”,收益率);
你能修复粘贴中的缩进吗?源代码像这样很难阅读谢谢你关注主题,已经很长时间找不到我问题的答案了。你能修复粘贴中的缩进吗?源代码像这样很难阅读谢谢你关注主题,已经很长时间找不到答案了关于我的问题。