Пятница, 22 Ноября 2024, 19:30

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 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;
};
DivESДата: Понедельник, 07 Октября 2019, 00:22 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Удобоваримый код для тех, кто захочет покопаться:
Код
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)) //если поток main  завершен.    
        {
            break;
        }
    };

    lua_close(L);
    return 0;
};

И да, было не лень :D


Сообщение отредактировал DivES - Понедельник, 07 Октября 2019, 00:35
  • Страница 1 из 1
  • 1
Поиск:

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