Улучшить многопоточное взаимодействие?

0

Вот код в строке # 1:

move = false;
//start thread #2
while(!move) Sleep(5);
//do stuff

Тема № 2:

//do stuff
move = true;

Есть ли лучший способ дождаться изменения перемещения, например, делать то, что называется блоком, пока данные не будут прочитаны в сети?

  • 0
    Вы знаете что-нибудь об использовании функций / методов обратного вызова?
  • 0
    Не могли бы вы объяснить, как это работает?
Показать ещё 3 комментария
Теги:

2 ответа

1
Лучший ответ

У вас есть способ.

Есть и другие вещи, которые вы можете использовать. Некоторые приходят мне в голову:

Использование условий

Условие где-то, где вы можете ждать() для другой части (потока) кода для сигнала(), вы можете продолжить

Условия связаны с мьютексом

В вашем коде:

Тема № 1

// start thread #2
mutex.acquire();
// You could check for an actual condition here if it
// is more complex than a true false.
condition.wait();
// If we're checking for a complex condition here
// we should re-evaluate in case it is not satisfied.
mutex.release();

Тема № 2

// do stuff
mutex.acquire();
condition.signal();
mutex.release();

Использование будущего

Будущее представляет собой конструкцию более высокого уровня для представления результата асинхронной операции.

Он работает примерно так:

  1. Вызывающий создает объект Future и сохраняет ссылку на него и передает ссылку на поток, выполняющий асинхронную операцию.
  2. Вызывающий продолжает обработку, а другой поток выполняет свою задачу.
  3. Если вызывающему нужно получить результат, он попытается получить его из объекта Future. Если результат еще не доступен, вызывающий абонент будет заблокирован (например, с использованием условия/сигнала), пока асинхронная операция не завершится и не установит значение (которое посылает сигнал).
  4. Если асинхронная операция завершается до того, как она понадобится, вызывающий абонент получит результат без ожидания.
1

Использование С++ 11? Используйте std :: condition_variable.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню