Пятница, 29 Марта 2024, 01:02

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Записи участника » egor230 [1]
Результаты поиска
egor230Дата: Воскресенье, 06 Октября 2019, 23:00 | Сообщение # 1 | Тема: найти ошибку в реализаций многопоточности.
уже был
Сейчас нет на сайте
Здравствуйте всем. Помогите пожалуйста найти ошибку в реализаций многопоточности.

Функция foo запускается из цикла основного потока функции main единожды, которая представляет из себя цикл, когда в функции foo вызывается функция yield() она уступает управления основному потоку(функции main ), потом включаем хук приостанавливает основном поток(функцию main ) через n время, уступая управления второму потоку(функции foo ). Всё идёт хорошо до 150 итерации основного потока. Помогите понять где ошибка?
Код
static int timerfirsttread = 0;// таймер для первого потока.
void LUAHook(lua_State* L, lua_Debug* ar) {
    timerfirsttread++;
    if (timerfirsttread > 16) {// сколько будет работать первый поток.
  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, 320 do
x=i*6
print(" func main "..i.."\n")
if i ==1
then my_yield(foo,40)
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--;    res1 = lua_resume(L1, L, args);    
  lua_xmove(L, L1, 1);
  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);
  lua_settop(L1, 0);
    }
    if (LUA_OK == lua_status(L)) { break; }// если поток main  завершен.    
};
    lua_close(L);
    return 0;
};
Форум игроделов » Записи участника » egor230 [1]
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг