使用 __block 的竞争条件

Posted

技术标签:

【中文标题】使用 __block 的竞争条件【英文标题】:race condition by using __block 【发布时间】:2017-06-08 14:40:12 【问题描述】:

我有一个 PHAsset 列表,我需要获取它们的关联 URL 并对每个 URL 执行一些操作。处理完所有资产后,我需要执行另一项任务。我尝试使用 __block 来计算处理的资产,但由于竞争条件它不可靠。有没有更好的方法来了解所有资产何时被处理?

    PHFetchResult* photosAsset = [PHAsset fetchAssetsInAssetCollection:collection options:fetchOptions2];
    __block int count = 0;

    for (int i = 0; i < photosAsset.count; ++i) 
        [[PHImageManager defaultManager] requestAVAssetForVideo:[photosAsset objectAtIndex:i] options:nil resultHandler:
         ^(AVAsset *avAsset, AVAudioMix *audioMix, NSDictionary *info) 
             NSURL *url = [(AVURLAsset *)avAsset URL];
             // then do something with the url here...

             ++count;
             NSLog(@"%d", count);
             if (count == photosAsset.count) 
                 NSLog(@"FINISHED!");
             
        ];
    

【问题讨论】:

可能是dispatch_group_enter()dispatch_group_leave()dispatch_group_notify() 【参考方案1】:

所以这里是基于@Larme 建议的解决方案:

    dispatch_group_t group = dispatch_group_create();

    for (int i = 0; i < photosAsset.count; ++i) 
        dispatch_group_enter(group);
        [[PHImageManager defaultManager] requestAVAssetForVideo:[photosAsset objectAtIndex:i] options:nil resultHandler:
         ^(AVAsset *avAsset, AVAudioMix *audioMix, NSDictionary *info) 
             dispatch_group_leave(group);
         ];
    

    dispatch_group_notify(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ 
        NSLog(@"FINISHED!");
    );

    dispatch_release(group);

【讨论】:

以上是关于使用 __block 的竞争条件的主要内容,如果未能解决你的问题,请参考以下文章

linux c编程:进程控制_竞争条件

Python asyncio 协议竞争条件

在 Python 中创建竞争条件文件夹

竞争条件攻击

moctf 没时间解释了 条件竞争漏洞

MOTCF 没时间解释了 条件竞争漏洞