[EAGLContext presentRenderbuffer导致死锁

问题描述 投票:0回答:1

我在IOS应用中使用openGLES。在某些情况下会发生死锁。死锁线程如下。似乎EAGLContext presentRenderbuffer导致semaphore::wait()在同步队列'gputools.DYSharedMemoryTransport.0x109700000.send'中,然后主线程到达等待相同的队列,这是死锁。我的问题是EAGLContext presentRenderbuffer如何导致等待semaphore::wait()

thread #1, queue = 'com.apple.main-thread'
    frame #0: 0x00000001a6c788b0 libsystem_kernel.dylib`__ulock_wait + 8
    frame #1: 0x000000010915b720 libdispatch.dylib`_dlock_wait + 52
    frame #2: 0x000000010915b504 libdispatch.dylib`_dispatch_thread_event_wait_slow + 48
    frame #3: 0x0000000109169c60 libdispatch.dylib`__DISPATCH_WAIT_FOR_QUEUE__ + 340
    frame #4: 0x0000000109169694 libdispatch.dylib`_dispatch_sync_f_slow + 176
    frame #5: 0x0000000109389284 GPUToolsCore`-[DYTransport send:inReplyTo:error:replyQueue:timeout:handler:] + 556
    frame #6: 0x00000001093759e0 GPUToolsCore`-[DYSharedMemoryTransport send:inReplyTo:error:replyQueue:timeout:handler:] + 232
    frame #7: 0x00000001a6e52094 CoreFoundation`__NSARRAY_IS_CALLING_OUT_TO_A_BLOCK__ + 16
    frame #8: 0x00000001a6d5566c CoreFoundation`-[__NSArrayM enumerateObjectsWithOptions:usingBlock:] + 192
    frame #9: 0x0000000109381a60 GPUToolsCore`CADisplayLink_initWithDisplayLink(CADisplayLink*, objc_selector*, void*) + 240
    frame #10: 0x00000001ad6a7fdc QuartzCore`+[CADisplayLink(CADisplayLinkPrivate) displayLinkWithDisplay:target:selector:] + 276
    frame #11: 0x0000000109381fd4 GPUToolsCore`CADisplayLink_displayLinkWithDisplay_target_selector(objc_class*, objc_selector*, CADisplay*, objc_object*, objc_selector*) + 112
    frame #12: 0x00000001aae4b8ec UIKitCore`-[_UITouchForceObservable receiveObservedValue:] + 164
    frame #13: 0x00000001aaa65444 UIKitCore`-[UIGestureRecognizer _updateForceClassifierWithEvent:] + 72
    frame #14: 0x00000001aaa655a0 UIKitCore`-[UIGestureRecognizer _touchesBegan:withEvent:] + 232
    frame #15: 0x00000001aaeddda8 UIKitCore`-[UITouchesEvent _sendEventToGestureRecognizer:] + 360
    frame #16: 0x00000001aaa5b7f8 UIKitCore`__47-[UIGestureEnvironment _updateForEvent:window:]_block_invoke + 68
    frame #17: 0x00000001aaa5b8f4 UIKitCore`-[UIGestureEnvironment _deliverEvent:toGestureRecognizers:usingBlock:] + 216
    frame #18: 0x00000001aaa5b77c UIKitCore`-[UIGestureEnvironment _updateForEvent:window:] + 204
    frame #19: 0x00000001aae9d238 UIKitCore`-[UIWindow sendEvent:] + 3324
    frame #20: 0x00000001aae79f64 UIKitCore`-[UIApplication sendEvent:] + 336
    frame #21: 0x00000001aaef0868 UIKitCore`__dispatchPreprocessedEventFromEventQueue + 5880
    frame #22: 0x00000001aaef2dc4 UIKitCore`__handleEventQueueInternal + 4924
    frame #23: 0x00000001aaeebc38 UIKitCore`__handleHIDEventFetcherDrain + 108
    frame #24: 0x00000001a6dfd090 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
    frame #25: 0x00000001a6dfcfe8 CoreFoundation`__CFRunLoopDoSource0 + 80
    frame #26: 0x00000001a6dfc780 CoreFoundation`__CFRunLoopDoSources0 + 180
    frame #27: 0x00000001a6df78cc CoreFoundation`__CFRunLoopRun + 1080
    frame #28: 0x00000001a6df716c CoreFoundation`CFRunLoopRunSpecific + 464
    frame #29: 0x00000001b0c2f328 GraphicsServices`GSEventRunModal + 104
    frame #30: 0x00000001aae61d0c UIKitCore`UIApplicationMain + 1936
    frame #31: 0x00000001046d4e00 BAvatar`main(argc=1, argv=0x000000016bc0f7b0) at main.m:14:16
    frame #32: 0x00000001a6c82424 libdyld.dylib`start + 4


thread #91
    frame #0: 0x00000001a6c56630 libsystem_kernel.dylib`semaphore_wait_trap + 8
    frame #1: 0x00000001c9d68864 caulk`caulk::mach::semaphore::wait() + 24
    frame #2: 0x00000001c9d63538 caulk`caulk::semaphore::timed_wait(double) + 140
    frame #3: 0x00000001c9d67220 caulk`caulk::concurrent::details::worker_thread::run() + 40
    frame #4: 0x00000001c9d673b0 caulk`void* caulk::thread_proxy<std::__1::tuple<caulk::thread::attributes, void (caulk::concurrent::details::worker_thread::*)(), std::__1::tuple<caulk::concurrent::details::worker_thread*> > >(void*) + 56
    frame #5: 0x00000001a6b9c1f0 libsystem_pthread.dylib`_pthread_start + 124
* thread #187, queue = 'gputools.DYSharedMemoryTransport.0x109700000.send'
    frame #0: 0x00000001a6c78238 libsystem_kernel.dylib`__semwait_signal + 8
    frame #1: 0x00000001a6ae5664 libsystem_c.dylib`nanosleep + 212
    frame #2: 0x00000001a6ae553c libsystem_c.dylib`usleep + 64
    frame #3: 0x0000000109376bac GPUToolsCore`-[DYSharedMemoryTransport _waitEAGAIN] + 40
    frame #4: 0x0000000109398940 GPUToolsCore`-[DYBaseStreamTransport _writeBuffers:] + 232
    frame #5: 0x0000000109398ed4 GPUToolsCore`-[DYBaseStreamTransport _sendMessage:error:] + 476
    frame #6: 0x0000000109389408 GPUToolsCore`__63-[DYTransport send:inReplyTo:error:replyQueue:timeout:handler:]_block_invoke.153 + 100
    frame #7: 0x000000010915ac88 libdispatch.dylib`_dispatch_client_callout + 16
    frame #8: 0x0000000109169dcc libdispatch.dylib`_dispatch_sync_invoke_and_complete_recurse + 132
    frame #9: 0x0000000109389284 GPUToolsCore`-[DYTransport send:inReplyTo:error:replyQueue:timeout:handler:] + 556
    frame #10: 0x00000001093759e0 GPUToolsCore`-[DYSharedMemoryTransport send:inReplyTo:error:replyQueue:timeout:handler:] + 232
    frame #11: 0x0000000106710470 libglInterpose.dylib`handle_frame_boundary + 456
    frame #12: 0x00000001068ca0d8 libglInterpose.dylib`_EAGLContext_PresentInterposeCommon(EAGLContext*, unsigned int, unsigned long, double, bool () block_pointer) + 1012
    frame #13: 0x00000001068c7ee4 libglInterpose.dylib`EAGLContext_presentRenderbuffer(EAGLContext*, objc_selector*, unsigned long) + 80```
ios multithreading opengl-es
1个回答
0
投票

EAGLContext是OpenGL的一部分,已弃用。您应该在此链接上切换到“金属”:https://developer.apple.com/documentation/coreimage/cicontext/1437609-init

© www.soinside.com 2019 - 2024. All rights reserved.