खोज…


बुनियादी धागा शब्दार्थ

मुख्य थ्रेड के निष्पादन से अलग एक नया थ्रेड, Thread.new का उपयोग करके बनाया जा सकता है।

thr = Thread.new {
  sleep 1 # 1 second sleep of sub thread
  puts "Whats the big deal"
}

यह स्वचालित रूप से नए थ्रेड का निष्पादन शुरू कर देगा।

मुख्य थ्रेड को निष्पादित करने के लिए, जब तक कि नया धागा बंद न हो जाए, तब तक join हो join :

thr.join #=> ... "Whats the big deal"

ध्यान दें कि जब आप ज्वाइन करते हैं, तो थ्रेड पहले ही समाप्त हो सकता है, जिस स्थिति में निष्पादन सामान्य रूप से जारी रहेगा। यदि कोई उप-थ्रेड कभी नहीं जुड़ता है, और मुख्य थ्रेड पूरा हो जाता है, तो उप-थ्रेड किसी भी शेष कोड को निष्पादित नहीं करेगा।

साझा संसाधनों तक पहुँच

एक चर को एक्सेस करने के लिए एक म्यूटेक्स का उपयोग करें जो कई थ्रेड्स से एक्सेस किया जाता है:

counter = 0
counter_mutex = Mutex.new

# Start three parallel threads and increment counter
3.times.map do |index|
  Thread.new do
    counter_mutex.synchronize { counter += 1 }
  end
end.each(&:join) # Wait for all threads to finish before killing the process

अन्यथा, वर्तमान में एक थ्रेड को दिखाई देने वाले counter का मान दूसरे थ्रेड द्वारा बदला जा सकता है।

Mutex बिना उदाहरण (उदाहरण के लिए देखें Thread 0 , जहां Before और After 1 से अधिक भिन्न होता है):

2.2.0 :224 > counter = 0; 3.times.map { |i| Thread.new { puts "[Thread #{i}] Before: #{counter}"; counter += 1; puts "[Thread #{i}] After: #{counter}"; } }.each(&:join)
[Thread 2] Before: 0
[Thread 0] Before: 0
[Thread 0] After: 2
[Thread 1] Before: 0
[Thread 1] After: 3
[Thread 2] After: 1

Mutex साथ उदाहरण:

2.2.0 :226 > mutex = Mutex.new; counter = 0; 3.times.map { |i| Thread.new { mutex.synchronize { puts "[Thread #{i}] Before: #{counter}"; counter += 1; puts "[Thread #{i}] After: #{counter}"; } } }.each(&:join)
[Thread 2] Before: 0
[Thread 2] After: 1
[Thread 1] Before: 1
[Thread 1] After: 2
[Thread 0] Before: 2
[Thread 0] After: 3

एक धागे को कैसे मारना है

आप उपयोग फोन Thread.kill या Thread.terminate :

thr = Thread.new { ... }
Thread.kill(thr)

एक धागा समाप्त करना

एक धागा समाप्त हो जाता है अगर यह अपने कोड ब्लॉक के अंत तक पहुंचता है। किसी धागे को जल्दी समाप्त करने का सबसे अच्छा तरीका यह है कि वह अपने कोड ब्लॉक के अंत तक पहुंचने के लिए मना ले। इस तरह, थ्रेड मरने से पहले सफाई कोड चला सकता है।

यह थ्रेड एक लूप चलाता है, जबकि उदाहरण चर जारी रखना सही है। इस चर को असत्य पर सेट करें, और धागा एक प्राकृतिक मौत मर जाएगा:

require 'thread'

class CounterThread < Thread
  def initialize
    @count = 0
    @continue = true

    super do
      @count += 1 while @continue
      puts "I counted up to #{@count} before I was cruelly stopped."
    end
  end

  def stop
    @continue = false
  end
end

counter = CounterThread.new
sleep 2
counter.stop


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow