powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Подскажите по коду
8 сообщений из 8, страница 1 из 1
Подскажите по коду
    #39420135
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Из книжки взял код, который очень странно написан. Есть класс с

Код: plaintext
1.
2.
private:
    QAtomicInt currentState; //возможные значения заданы в перечислении Ready, Working, Sleeping, Finishing,  Finished



Например, как понять метод класса для завершения потока?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void Thread::quit()
{
currentState.testAndSetAcquire(Ready, Finished);
while(!currentState.testAndSetOrdered(Working, Finishing) &&
     !currentState.testAndSetOrdered(Sleeping, Finishing) &&
     currentState != Finishing && currentState != Finished);
}



Ведь должно быть так:
Код: plaintext
1.
2.
3.
4.
5.
6.
void Thread::quit()
{
if(currentState.testAndSetAcquire(Ready, Finished))return;
else if(currentState.testAndSetAcquire(Working, Finishing))return;
else if(currentState.testAndSetAcquire(Sleeping, Finishing))return;
}
...
Рейтинг: 0 / 0
Подскажите по коду
    #39420154
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLдолжно быть так
Ожидания нет в этом варианте.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подскажите по коду
    #39420238
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Так и во втором случае нет ожидания: цикл выполняется пока значение переменной currentState не равно одному из всех возможных значений. Другими словами какая-то мутная конструкция.
...
Рейтинг: 0 / 0
Подскажите по коду
    #39420247
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLкакая-то мутная конструкция.
Почему мутная? Обычные активные попытки перевести переменную в заданное состояние пока
никто не видит. Твои ифы не учитывают параллельную работу других аналогичных функций.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подскажите по коду
    #39420254
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Ты хочешь сказать, что
Код: plaintext
1.
currentState.testAndSetAcquire(Working, Finished) и currentState.testAndSetOrdered(Sleeping, Finishing)



не всегда за раз выполняются? И надо долбить много раз, пока не выполнится? Тогда почему автор книги перед циклом делает так:
Код: plaintext
1.
currentState.testAndSetAcquire(Ready, Finished);
...
Рейтинг: 0 / 0
Подскажите по коду
    #39420262
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLне всегда за раз выполняются? И надо долбить много раз, пока не выполнится?

Судя по слову test в названии - да. Для полной уверенности - читай документацию по этому
классу.

AlekseySQLТогда почему автор книги перед циклом делает так
А это ты уже у него спрашивай.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подскажите по коду
    #39422618
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я разобрался: бывают так называемые "ложные срабатывания", при которых значение переменной не меняется, а метод возвращает ложь. Поэтому атомарные операции оборачивают подобными конструкциями (чтобы проскочить ложные срабатывания):

Код: plaintext
1.
2.
3.
bool expected = false;
extern atomic<bool> b; //установлена где-то в другом месте
while(!b.compare_exchange_weak(expected, true) && !expected);
...
Рейтинг: 0 / 0
Подскажите по коду
    #39422656
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLЯ разобрался: бывают так называемые "ложные срабатывания", при которых значение переменной не меняется, а метод возвращает ложь. Поэтому атомарные операции оборачивают подобными конструкциями (чтобы проскочить ложные срабатывания):

Код: plaintext
1.
2.
3.
bool expected = false;
extern atomic<bool> b; //установлена где-то в другом месте
while(!b.compare_exchange_weak(expected, true) && !expected);


В этом примере цикл пока b не станет true. В чем его смысл - непонятно. Тоже самое
Код: plaintext
1.
b = true;



Изначально задумано такое использование compare_exchange:
Код: plaintext
1.
2.
3.
4.
5.
6.
extern atomic<bool> b; //установлена где-то в другом месте
bool expected = b;
... тут что-то делаем в зависимости от значения b
while(!b.compare_exchange_weak(expected, true)) { // атомарно меняем значение b на true если текущее значение b == expected
    ... значение b поменялось другим потоком, в expected новое значение, переделываем с учетом expected
}
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Подскажите по коду
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]