मैंने एक्सकोड 9.4.1 में थ्रेड सैनिटाइज़र चालू किया और अब मुझे अपने घूर्णन बफर (2 तक के आकार का) पर एक अजीब दौड़ की स्थिति की चेतावनी मिल रही है। मैंने सोचा होगा कि यहां उचित सेमाफोर उपयोग ने इस मुद्दे को समाप्त कर दिया होगा। मुझे यह उल्लेख करना चाहिए कि यह बफर एक अलग 'पहले' MTKView में दूसरे रेंडर एन्कोड के आउटपुट से आता है। मेरे पास एक सेमाफोर है जिसे मैंने दूसरे डाउनस्ट्रीम व्यू में dispatch_semaphore_create(1) के माध्यम से प्रारंभ किया है।

मेरे पहले MTKView में मैंने इसे प्रतिबद्ध करने के बाद निम्नानुसार प्रदान की गई बनावट को पकड़ लिया, और फिर डाउनस्ट्रीम व्यू के सेमाफोर का उपयोग करके इसे डाउनस्ट्रीम बफर में संलग्न किया:

[commandBuffer presentDrawable:self.currentDrawable];
[commandBuffer commit];
//[commandBuffer waitUntilCompleted]; // (doesn't matter if this is in or out)
...
id obj = [self.renderedQueue firstObject];
for (MonitorMTKView *v in self.downstreamOutputs) {
   dispatch_semaphore_wait(v.bufferSemaphore,DISPATCH_TIME_FOREVER);
   [v.textureQueue addObject:inputTexture];
   if ([v.textureQueue count]>2)
      [v.textureQueue removeObjectAtIndex:0];
   dispatch_semaphore_signal(v.bufferSemaphore);
}

अब मेरे डाउनस्ट्रीम MTKView में रेंडर लूप पर। मैं कमांड बफर करता हूं और मेरे पास यह पूरा करने वाला हैंडलर है:

__block __weak __typeof__(self) weakSelf = self;
[commandBuffer addCompletedHandler:^(id<MTLCommandBuffer> buffer) {
   dispatch_semaphore_wait(weakSelf.bufferSemaphore, DISPATCH_TIME_FOREVER);
   id obj = [weakSelf.textureQueue firstObject];

**// thread sanitizer issue on this next line of code "Race on a library object detected" **
   [weakSelf.textureQueue removeObject:obj];

   dispatch_semaphore_signal(weakSelf.bufferSemaphore);
}


सेमाफोर-संरक्षित क्या है इसके आसपास दौड़ की स्थिति क्यों है? क्या कुछ ऐसा है जो मैं बहुत गलत कर रहा हूं?। बफर स्वयं GPU- आधारित नहीं है, इसलिए वहां हस्तक्षेप नहीं हो सकता है।

सोच की एक पंक्ति इसे ट्रिपल-बफर करना है, लेकिन इससे समस्या कम नहीं होती है, इसलिए मुझे नहीं लगता कि इसका GPU हस्तक्षेप है।

0
zzyzy 3 अक्टूबर 2018, 08:22

1 उत्तर

सबसे बढ़िया उत्तर

ऐप्पल मेटल प्रलेखन इंगित करता है कि बफर भरने और जीपीयू को पास करने के बीच दौड़ की स्थिति से बचने के लिए आपको 3 बफर का उपयोग करना चाहिए।

0
MoDJ 4 नवम्बर 2018, 01:25