Почему Boost scoped_lock не разблокирует мьютекс?

В быстрый ответ dizy .. это работает для меня

  var assetVideoTrack = (sourceAsset.tracksWithMediaType(AVMediaTypeVideo)).last as! AVAssetTrack

  var compositionVideoTrack = (composition.tracksWithMediaType(AVMediaTypeVideo)).last as! AVMutableCompositionTrack

  if (assetVideoTrack.playable && compositionVideoTrack.playable) {

       compositionVideoTrack.preferredTransform = assetVideoTrack.preferredTransform
   }
13
задан Gilad Naor 21 October 2010 в 08:30
поделиться

2 ответа

scoped_lock действительно должен быть освобожден в конце области видимости. Однако вы не блокируете waitBoolean, когда зацикливаетесь на нем, предлагая не защищать его должным образом и в других местах - например, где для него установлено значение false, и вы получите неприятные условия гонки.

Я бы сказал, что вы должны использовать boost :: condition_variable для выполнения таких действий вместо проверки сна + небезопасности потоков.

16
ответ дан 1 December 2019 в 19:08
поделиться

Для синхронизации двух потоков используйте условную переменную. Это современный способ синхронизации двух потоков так, как вы хотите:

Используя ускорение, ожидающая часть выглядит примерно так:

void BoostSynchronisationPoint::waitSynchronisation()
{
    boost::unique_lock<boost::mutex> lock(_mutex);

    _synchronisationSent = false;
    while(!_synchronisationSent)
    {
        _condition.wait(lock); // unlock and wait
    }
}

Уведомляющая часть выглядит примерно так:

void BoostSynchronisationPoint::sendSynchronisation()
{
    {
        boost::lock_guard<boost::mutex> lock(_mutex);
        _synchronisationSent = true;
    }

    _condition.notify_all();
}

Задача _synchronisationSent - избегать внезапные пробуждения: см. wikipedia

22
ответ дан 1 December 2019 в 19:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: