[MacRuby-devel] Thread safety in apply example?

Matt Massicotte massicotte at apple.com
Mon Jan 24 07:22:44 PST 2011


What's the advantage of this over just iterating over the array serially using each?

Matt

On Jan 24, 2011, at 3:40 AM, Alan Skipp wrote:

> Warning, horrible hack alert!
> I'm sure there must be a far better implementation, but the idea is to have an array subclass which diverts all method calls through a serial dispatch queue, which should ensure thread safe access.
> 
> Anyway, here's the horrible hack. By the way, it manages to break Enumerable, other than that it's perfect!
> 
> class ThreadSafeArray < Array  
>  instance_methods.each do |meth|
>    eval "
>    def #{meth}(*args, &block)
>      val = []
>      @serial_queue.async(@group) do      
>        val[0] = super
>      end
>      @group.wait
>      val[0]
>    end"
>  end
> 
>  def initialize(size=0, obj=nil)
>    @serial_queue = Dispatch::Queue.new("array.serial_queue")
>    @group = Dispatch::Group.new
>    super
>  end
> end
> 
> gcdq = Dispatch::Queue.new('doc')
> @result = ThreadSafeArray.new
> gcdq.apply(5) {|i| @result[i] = i*i }
> p @result  #=> [0, 1, 4, 9, 16, 25]
> 
> 
> Having to create an array for every method call to copy the return value into is terrible, is there a better way of getting a reference to the return value from a dispatch queue?
> 
> 
> 
> On 22 Jan 2011, at 14:52, Ernest N. Prabhakar, Ph.D. wrote:
> 
>> Hi Charles,
>> 
>> On Jan 21, 2011, at 9:57 PM, Charles Oliver Nutter wrote:
>> 
>>> I'm curious about this example in Queue#apply's rdoc:
>>> 
>>> *     gcdq = Dispatch::Queue.new('doc')
>>> *     @result = []
>>> *     gcdq.apply(5) {|i| @result[i] = i*i }
>>> *     p @result  #=> [0, 1, 4, 9, 16, 25]
>>> 
>>> apply is said to issue the jobs in parallel, so this would be making
>>> concurrent updates to the @result array. Are simple arrays in MacRuby
>>> thread-safe?
>> 
>> My assumption was that doing a parallel assign:
>> 
>> result[i] = i*i
>> 	
>> would be safe, since it always accessed a unique portion of memory, but doing a serial append:
>> 
>> result << i*i
>> 
>> would not.  But that may have been a mistake on my part, since the size (at least) needs to be updated. Anyone know better?
>> 
>> -- Ernie P.
>> 
>> 
>>> 
>>> - Charlie
>>> _______________________________________________
>>> MacRuby-devel mailing list
>>> MacRuby-devel at lists.macosforge.org
>>> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
>> 
>> _______________________________________________
>> MacRuby-devel mailing list
>> MacRuby-devel at lists.macosforge.org
>> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
> 
> _______________________________________________
> MacRuby-devel mailing list
> MacRuby-devel at lists.macosforge.org
> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 3737 bytes
Desc: not available
URL: <http://lists.macosforge.org/pipermail/macruby-devel/attachments/20110124/ce20626d/attachment.bin>


More information about the MacRuby-devel mailing list