Обход busy waiting. - C++

265
21 января 2018, 04:29

Здравствуйте.
Как обойти busy-waiting на C++?
Вот код:

bool checkPass(string bla)
{
    if (bla != pass)
    return false;
    return true;
}
char nextSymbol(int Number)
{
    char symbol;
    if (Number <= 3)
        symbol = Number + 35;
    if (Number >= 4 && Number <= 13)
        symbol = Number + 44;
    if (Number >= 14 && Number <= 39)
        symbol = Number + 51;
    if (Number >= 40 && Number <= 65)
        symbol = Number + 57;
    if (Number == 66)
        symbol = 64;
    return symbol;
}
bool addThread = true;
bool Authentificated = false;
bool checkPassword=false;
bool Variable[32];
int numOfThreads = 0;
string someThing ="";
string ScheckPassword = "";
string return_value="";
thread* threads;
void brute(int myID)
{
    while (!Authentificated)
    {
        while (!(Variable[myID]))
        {
            Sleep(50);
        }
        int symbol = 0;
        while (symbol < 67)
        {
            someThing[myID] = nextSymbol(symbol);
            checkPassword = true;
            while (checkPassword)
            {
                Sleep(25);
                if (Authentificated) {
                    return;
                }
            }
            if (Authentificated)
            {return;}
                        if (myID < numOfThreads - 1)
            {
                Variable[myID] = false;/*Sleep*/
                Variable[myID + 1] = true;/*Wake up*/
                while (!(Variable[myID]))
                {
                    Sleep(50);
                }
            }
            symbol++;
        }
        if (myID == 0)
            addThread = true;
        else
        {
            Variable[myID] = false;
            Variable[myID - 1] = true;/*Wake UP*/
        }
    }

}
void multiThreadBruteForce()
{
    bool end=false;
    while (!end)
    {
        if (addThread && numOfThreads<32)
        {
            someThing += " ";
            Variable[numOfThreads] = true;
            threads[numOfThreads] = thread(brute, numOfThreads);
            numOfThreads++;
            addThread = false;
        }
        if (checkPassword)
        {
            ScheckPassword = someThing;
            if (checkPass(ScheckPassword)) {
                for (int i = 0; i <= numOfThreads; i++)
                    threads[i].detach();
                Authentificated = true;
                return_value = ScheckPassword;
                checkPassword = false;
                return;
            }
            checkPassword = false;
        }
    }
}

Вместо структуры

while()
{
Sleep();
}

Сделать что-то эффективней.
Ничего путного пока не нашел.

READ ALSO
Как сделать текст у checkbox&#39;а зачёркнутым?

Как сделать текст у checkbox'а зачёркнутым?

Привет всем! Есть такой чекбокс

458
Class class = null; Что это значит?

Class class = null; Что это значит?

Столкнулся в примере с такой записьюЧто она значит и для чего ее используют?

253
Установка кодировки в java коде

Установка кодировки в java коде

Имеется код который выполняет поиск строк в файле:

381