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; };
|
|
| |