В быстрый ответ 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
}
scoped_lock действительно должен быть освобожден в конце области видимости. Однако вы не блокируете waitBoolean, когда зацикливаетесь на нем, предлагая не защищать его должным образом и в других местах - например, где для него установлено значение false, и вы получите неприятные условия гонки.
Я бы сказал, что вы должны использовать boost :: condition_variable для выполнения таких действий вместо проверки сна + небезопасности потоков.
Для синхронизации двух потоков используйте условную переменную. Это современный способ синхронизации двух потоков так, как вы хотите:
Используя ускорение, ожидающая часть выглядит примерно так:
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