Привет, мне нужно использовать логические флаги в функциях обратного вызова в моей программе для управления поведением программы. Потоки обратного вызова выполняются в других потоках, чем потоки, которые их настраивают. В одной из моих функций обратного вызова программа устанавливает логический флаг, а в другой проверяет другой несвязанный логический флаг. В настоящее время я использую для этой цели std::atomic_bool.
Я читал о возможности взаимоблокировки с переменными std::atomic. Стоит ли беспокоиться в моем случае? Есть ли еще что-нибудь, о чем стоит беспокоиться?
Правильно ли я использую атомные переменные, как обычные переменные? Если нет, то как мне это делать?
Должен ли я вместо этого использовать std::atomic_flag?
И компилятор не выдал ошибку при инициализации standbyResumeTimerDelayBool, как показано ниже, в списке членов класса, не уверен, правильно это или нет.
Спасибо!
//some code omitted to keep things simple
//first callback function, this boolean flag is checked at one other point in the program
static ULONG Replicator::standbyResumeCallbackFunction(PVOID context, ULONG type, PVOID setting);
ULONG Replicator::standbyResumeCallbackFunction(PVOID context, ULONG type, PVOID setting)
{
if (type == PBT_APMRESUMEAUTOMATIC)
{
Replicator* replicator = reinterpret_cast(context);
replicator->standbyResumeSetTimerDelayBool();
}
}
//Replicator class members
void standbyResumeSetTimerDelayBool() { standbyResumeTimerDelayBool = true; }
std::atomic_bool standbyResumeTimerDelayBool = false;
//behavior modified here
void Replicator::autoBackup()
{
if (standbyResumeTimerDelayBool)
{
standbyResumeTimerDelayBool = false;
//do stuff
}
}
//second callback function
static DWORD CALLBACK copyProgress(
LARGE_INTEGER totalSize, LARGE_INTEGER totalTransferred,
LARGE_INTEGER streamSize, LARGE_INTEGER streamTransferred,
DWORD streamNo, DWORD callbackReason, HANDLE src, HANDLE dst,
LPVOID data);
DWORD Worker::copyProgress(LARGE_INTEGER totalSize, LARGE_INTEGER totalTransferred, LARGE_INTEGER, LARGE_INTEGER, DWORD, DWORD, HANDLE, HANDLE, LPVOID data)
{
Worker *worker = static_cast(data);
if (worker->getStop())
return PROGRESS_CANCEL;
}
//Worker class members
bool getStop() { return cancel; }
std::atomic_bool cancel;
//cancel is set to false when backup begins
void Worker::startBackup()
{
cancel = false;
}
//if user clicks cancel button cancel flag is set to false
void stop() { cancel = true; }
Подробнее здесь: https://stackoverflow.com/questions/792 ... tomic-flag
Как использовать std::atomic_bool или std::atomic_flag? ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1732747832
Anonymous
Привет, мне нужно использовать логические флаги в функциях обратного вызова в моей программе для управления поведением программы. Потоки обратного вызова выполняются в других потоках, чем потоки, которые их настраивают. В одной из моих функций обратного вызова программа устанавливает логический флаг, а в другой проверяет другой несвязанный логический флаг. В настоящее время я использую для этой цели std::atomic_bool.
Я читал о возможности взаимоблокировки с переменными std::atomic. Стоит ли беспокоиться в моем случае? Есть ли еще что-нибудь, о чем стоит беспокоиться?
Правильно ли я использую атомные переменные, как обычные переменные? Если нет, то как мне это делать?
Должен ли я вместо этого использовать std::atomic_flag?
И компилятор не выдал ошибку при инициализации standbyResumeTimerDelayBool, как показано ниже, в списке членов класса, не уверен, правильно это или нет.
Спасибо!
//some code omitted to keep things simple
//first callback function, this boolean flag is checked at one other point in the program
static ULONG Replicator::standbyResumeCallbackFunction(PVOID context, ULONG type, PVOID setting);
ULONG Replicator::standbyResumeCallbackFunction(PVOID context, ULONG type, PVOID setting)
{
if (type == PBT_APMRESUMEAUTOMATIC)
{
Replicator* replicator = reinterpret_cast(context);
replicator->standbyResumeSetTimerDelayBool();
}
}
//Replicator class members
void standbyResumeSetTimerDelayBool() { standbyResumeTimerDelayBool = true; }
std::atomic_bool standbyResumeTimerDelayBool = false;
//behavior modified here
void Replicator::autoBackup()
{
if (standbyResumeTimerDelayBool)
{
standbyResumeTimerDelayBool = false;
//do stuff
}
}
//second callback function
static DWORD CALLBACK copyProgress(
LARGE_INTEGER totalSize, LARGE_INTEGER totalTransferred,
LARGE_INTEGER streamSize, LARGE_INTEGER streamTransferred,
DWORD streamNo, DWORD callbackReason, HANDLE src, HANDLE dst,
LPVOID data);
DWORD Worker::copyProgress(LARGE_INTEGER totalSize, LARGE_INTEGER totalTransferred, LARGE_INTEGER, LARGE_INTEGER, DWORD, DWORD, HANDLE, HANDLE, LPVOID data)
{
Worker *worker = static_cast(data);
if (worker->getStop())
return PROGRESS_CANCEL;
}
//Worker class members
bool getStop() { return cancel; }
std::atomic_bool cancel;
//cancel is set to false when backup begins
void Worker::startBackup()
{
cancel = false;
}
//if user clicks cancel button cancel flag is set to false
void stop() { cancel = true; }
Подробнее здесь: [url]https://stackoverflow.com/questions/79231788/how-to-use-stdatomic-bool-or-stdatomic-flag[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия