C ++ MF C Отслеживание вызовов событий - PullRequest
0 голосов
/ 10 января 2020

У меня есть основной поток и другой рабочий поток, который выполняет некоторую обработку. В настоящее время я сигнализирую о событиях из основного потока, на которые рабочий поток должен ответить. В моем основном потоке у меня есть следующее:

frameNo = 1;
for (int j = 0; j < 10; j++) {
    frameNo++;
    tEvent->SetEvent();
}

В моем рабочем потоке у меня есть это:

int RThread::Run()
{   
    while (1) {
        WaitForSingleObject(myEvent->m_hObject, INFINITE);
        std::cout << "Event signalled!" << std::endl;
        std::cout << "Frame number is: " + std::string(obj->frameNo) << std::endl;
    }

    return 0;
}

На данный момент рабочий поток печатает только то, что frameNo является равный 11, я предполагаю, потому что основной поток выполняет итерацию настолько быстро, что рабочий поток достигает этой стадии, только когда frameNo уже увеличен до 11. В результате ему не хватает чисел 1-10.

Я не хочу пропустить цифры 1-10, хотя это может быть немного позади.

Как я могу каким-то образом отслеживать, сколько раз было установлено событие? Я думал о том, чтобы просто не использовать события вообще, а вместо этого просто использовать Очередь для получения переменных sh, в то время как рабочий поток просто берет из очереди. Но если я использую эту очередь, понадобится ли какой-то критический раздел вокруг очереди, так как оба потока ее модифицируют?

Ответы [ 2 ]

1 голос
/ 10 января 2020

Если вы хотите, чтобы дочерний поток видел каждый кадр отдельно, вам нужно добавить синхронизацию, чтобы обеспечить строгое изменение между родительским и дочерним потоками.

Например, вы можете сделать что-то вроде:

Parent

  1. Генерировать кадр
  2. Дочерний кадр сигнала готов
  3. Ожидать от дочернего сигнала, что кадр был обработан
  4. repeat

Child

  1. Ожидание сигнала от родителя
  2. Обработка кадра
  3. Сигнал родителя о том, что кадр был обработан
  4. repeat

Однако, если вы не настроены на использование потоков, это кажется плохим использованием потоков. Основная задача потоков - запускать вещи одновременно, но в этом случае вам, кажется, нужно последовательное выполнение, поэтому вы можете также использовать один поток.

Да, вы также можете просто поставить данные в очередь для дочернего элемента. нить для обработки. Да, это обычно включает мьютекс. Но если вы занимаетесь многопоточным программированием, то в любом случае неплохо иметь поточно-ориентированную очередь. Для одного примера: { ссылка }

0 голосов
/ 10 января 2020

Используйте std :: обещание и std :: future для синхронизации действий вашего пинг-понга. То, что вы используете 28-летнюю MF C, не означает, что вы не можете использовать современные идиомы C ++. Эта возможность существует с C ++ 11 и избавляет от синхронизации потоков. Совместно используемые интеллектуальные указатели C ++ 11, такие как std :: shared_ptr и std :: unique_ptr , дали нам динамическое управление памятью c без утечек и т. Д. Помните, что C ++ скоро исполняется 40 лет, и пока нет никаких признаков того, что его эволюция замедляется, fx, C ++ 20 принесут нам Концепции , сопрограммы и Модули . В этом году Херб Саттер, председатель ISO C ++, сообщил, что более 200 ученых c победителей представили документы в прошлом году, по сравнению с 125 годом ранее. И MF C может быть бенефициаром, если вы хотите узнать что-то новое (или ваш менеджер позволит вам).

...