信号量是否在三重缓冲示例中使用阻塞主线程?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了信号量是否在三重缓冲示例中使用阻塞主线程?相关的知识,希望对你有一定的参考价值。
看看Apple为金属缓冲区和纹理资源的三重缓冲提供的代码,使用信号量可能会阻塞代码中的主线程,如下所示,这似乎很奇怪。这是来自CPU and GPU Synchronization。
- (void)drawInMTKView:(nonnull MTKView *)view
dispatch_semaphore_t inFlightSemaphore = self.inFlightSemaphore;
dispatch_semaphore_wait(inFlightSemaphore, DISPATCH_TIME_FOREVER);
id <MTLCommandBuffer> commandBuffer = [mrc.commandQueue commandBuffer];
__block dispatch_semaphore_t block_sema = inFlightSemaphore;
[commandBuffer addCompletedHandler:^(id<MTLCommandBuffer> buffer)
dispatch_semaphore_signal(block_sema);
];
// Metal render commands
如何在调用drawInMTKView时调用dispatch_semaphore_wait()不阻塞主线程?
答案
它绝对可以阻止绘图线程,但在大多数应用程序中,这应该很少发生,如果有的话。当绘图由显示链接驱动时,与MTKView
默认情况一样,绘制回调每隔约16ms到达。由于计数信号量允许在阻塞之前编码最多三个帧,因此这些帧中的第一个几乎肯定已经在后续帧回调到达之前已经完成执行(即,在50ms内),因此等待调用不需要一个街区。如果编码或执行平均花费的时间长于标称帧持续时间,则等待呼叫将阻塞,直到最近的未完成帧完成。
以上是关于信号量是否在三重缓冲示例中使用阻塞主线程?的主要内容,如果未能解决你的问题,请参考以下文章
QT串口编程 - 阻塞主机示例(Blocking Master)
如何为 3 个不同的事件(信号量、pthread 条件和阻塞套接字接收)阻塞单个线程?