Multithreading 多线程实现中的bug

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

请帮我找到多线程实现中的一个bug

我试图通过一个钩子实现多线程,经过n次迭代后,钩子会发送到堆栈lua_yield(L,0);,它挂起主线程,将控制权让给第二个线程。 foo函数从main函数的主线程循环运行一次,这是一个循环,当在foo函数中调用yield()函数时,它将控制权交给主线程(main函数),然后在n次之后打开钩子挂起主线程(main函数),将控制权交给第二个线程(foo函数)。在主线程的第150次迭代之前,一切都进展顺利。帮助了解错误在哪里

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,“收益率”,收益率);

你能修复粘贴中的缩进吗?源代码像这样很难阅读谢谢你关注主题,已经很长时间找不到我问题的答案了。你能修复粘贴中的缩进吗?源代码像这样很难阅读谢谢你关注主题,已经很长时间找不到答案了关于我的问题。