मुझे sync.Cond
का सही तरीके से उपयोग करने का तरीका पता लगाने में परेशानी हो रही है। जो मैं बता सकता हूं, लॉकर लॉक करने और हालत की प्रतीक्षा विधि का आविष्कार करने के बीच दौड़ की स्थिति मौजूद है।sync.Cond का सही तरीके से उपयोग कैसे करें?
package main
import (
"sync"
"time"
)
func main() {
m := sync.Mutex{}
c := sync.NewCond(&m)
go func() {
time.Sleep(1 * time.Second)
c.Broadcast()
}()
m.Lock()
time.Sleep(2 * time.Second)
c.Wait()
}
यह एक तत्काल आतंक का कारण बनता है: इस उदाहरण रेस स्थिति अनुकरण करने के लिए मुख्य goroutine में दो लाइनों के बीच एक कृत्रिम देरी कहते हैं
fatal error: all goroutines are asleep - deadlock! goroutine 1 [semacquire]: sync.runtime_Syncsemacquire(0x10330208, 0x1) /usr/local/go/src/runtime/sema.go:241 +0x2e0 sync.(*Cond).Wait(0x10330200, 0x0) /usr/local/go/src/sync/cond.go:63 +0xe0 main.main() /tmp/sandbox301865429/main.go:17 +0x1a0
क्या क्या मैं गलत कर रहा हूँ? मैं इस स्पष्ट दौड़ की स्थिति से कैसे बचूं? क्या कोई बेहतर सिंक्रनाइज़ेशन निर्माण है जिसका उपयोग करना चाहिए?
संपादित करें: मुझे पता है मैं बेहतर होना चाहिए समस्या मैं यहाँ हल करने के लिए कोशिश कर रहा हूँ की व्याख्या की। मेरे पास एक लंबी दौड़ वाली गोरौटाइन है जो एक बड़ी फ़ाइल और कई अन्य गोरोटाइन डाउनलोड करती है जिन्हें उपलब्ध होने पर HTTP हेडर तक पहुंच की आवश्यकता होती है। यह समस्या यह लगता है की तुलना में कठिन है।
मैं चैनलों का उपयोग नहीं कर सकता क्योंकि केवल एक goroutine मूल्य प्राप्त होगा। और कुछ अन्य goroutines पहले से ही उपलब्ध होने के बाद हेडर को पुनर्प्राप्त करने की कोशिश कर रहे हैं।
डाउनलोडर goroutine बस HTTP हेडर को एक चर में संग्रहीत कर सकता है और उन तक पहुंच की सुरक्षा के लिए एक म्यूटेक्स का उपयोग कर सकता है। हालांकि, यह अन्य goroutines के लिए उपलब्ध होने के लिए "प्रतीक्षा" करने का एक तरीका प्रदान नहीं करता है।
मैंने सोचा था कि sync.Mutex
और sync.Cond
दोनों एक साथ इस लक्ष्य को पूरा कर सकते हैं लेकिन ऐसा लगता है कि यह संभव नहीं है।
क्या होगा अगर यह goroutine शुरू करने से पहले म्युटेक्स लॉक करने के लिए संभव नहीं है? उदाहरण के लिए, प्रतीक्षा() को कॉल करने वाले अन्य goroutines हो सकते हैं। –
से भी संभव है, कि जब ब्रॉडकास्ट कहा जाता है, तो कोई अन्य गोरौटाइन अधिसूचित नहीं किया जाएगा। यह भी ठीक है - लेकिन हम दोनों का क्या उल्लेख नहीं है - आमतौर पर स्थिति कुछ राज्य से जुड़ी होती है। और प्रतीक्षा का मतलब है - मैं इस स्थिति में सिस्टम जारी रखने के दौरान जारी नहीं रख सकता, प्रतीक्षा करें। और प्रसारण का मतलब है - राज्य बदल गया है, हर कोई जो इंतजार कर रहा है उसे जांचना चाहिए कि वह जारी रख सकता है या नहीं। कृपया goroutines दोनों में गणना की गई सटीक रूप से वर्णन करें, और उन्हें एक-दूसरे से संवाद क्यों करना है। – lofcek
क्षमा करें, मुझे मूल प्रश्न में अधिक जानकारी मिलनी चाहिए थी। मैंने एक संपादन जोड़ा है जो ठीक से वर्णन करता है कि मैं क्या करने की कोशिश कर रहा हूं। –