Robert Ash
----------


On 24 Jan 2011, at 16:25, macruby-devel-requ...@lists.macosforge.org wrote:

> Send MacRuby-devel mailing list submissions to
>    macruby-devel@lists.macosforge.org
> 
> To subscribe or unsubscribe via the World Wide Web, visit
>    http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
> or, via email, send a message with subject or body 'help' to
>    macruby-devel-requ...@lists.macosforge.org
> 
> You can reach the person managing the list at
>    macruby-devel-ow...@lists.macosforge.org
> 
> When replying, please edit your Subject line so it is more specific
> than "Re: Contents of MacRuby-devel digest..."
> 
> 
> Today's Topics:
> 
>   1. Re: Thread safety in apply example? (Matt Massicotte)
>   2. Re: Thread safety in apply example? (Alan Skipp)
>   3. Re: Thread safety in apply example? (Matt Massicotte)
> 
> 
> ----------------------------------------------------------------------
> 
> Message: 1
> Date: Mon, 24 Jan 2011 07:22:44 -0800
> From: Matt Massicotte <massico...@apple.com>
> To: "MacRuby development discussions."
>    <macruby-devel@lists.macosforge.org>
> Subject: Re: [MacRuby-devel] Thread safety in apply example?
> Message-ID: <48dbc4a8-59d1-42f0-8dd3-2291668d6...@apple.com>
> Content-Type: text/plain; charset="us-ascii"
> 
> 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@lists.macosforge.org
>>>> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
>>> 
>>> _______________________________________________
>>> MacRuby-devel mailing list
>>> MacRuby-devel@lists.macosforge.org
>>> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
>> 
>> _______________________________________________
>> MacRuby-devel mailing list
>> MacRuby-devel@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-0001.bin>
> 
> ------------------------------
> 
> Message: 2
> Date: Mon, 24 Jan 2011 16:00:41 +0000
> From: Alan Skipp <al_sk...@fastmail.fm>
> To: "MacRuby development discussions."
>    <macruby-devel@lists.macosforge.org>
> Subject: Re: [MacRuby-devel] Thread safety in apply example?
> Message-ID: <184bdafb-c983-43af-8908-912380237...@fastmail.fm>
> Content-Type: text/plain; charset=us-ascii
> 
> The post was admittedly vague, but was more of an idea about a general 
> purpose thread safe array class (in principle, this could apply to any 
> mutable class). Perhaps implemented as a module that would redirect all 
> method calls through a serial dispatch queue. This would mean that the array 
> (or other mutable collection) could be mutated from multiple threads/queues 
> without fear of bad things happening.
> 
> On 24 Jan 2011, at 15:22, Matt Massicotte wrote:
> 
>> 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@lists.macosforge.org
>>>>> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
>>>> 
>>>> _______________________________________________
>>>> MacRuby-devel mailing list
>>>> MacRuby-devel@lists.macosforge.org
>>>> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
>>> 
>>> _______________________________________________
>>> MacRuby-devel mailing list
>>> MacRuby-devel@lists.macosforge.org
>>> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
>> 
>> _______________________________________________
>> MacRuby-devel mailing list
>> MacRuby-devel@lists.macosforge.org
>> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
> 
> 
> 
> ------------------------------
> 
> Message: 3
> Date: Mon, 24 Jan 2011 08:24:04 -0800
> From: Matt Massicotte <massico...@apple.com>
> To: "MacRuby development discussions."
>    <macruby-devel@lists.macosforge.org>
> Subject: Re: [MacRuby-devel] Thread safety in apply example?
> Message-ID: <1a135050-6824-4d8b-bfb3-03003143d...@apple.com>
> Content-Type: text/plain; charset="us-ascii"
> 
> My guess is that most problems need a thread-safe mechanism, where 
> manipulating an array is just one part of a more complex system.  Pushing the 
> details of the thread-safety into the array just hides the problem, and will 
> likely trade more locking for possibly simpler code.
> 
> Which could be a very good trade, don't get me wrong.  I'm not trying to 
> knock your implementation at all.
> 
> I'm just saying that achieving parallelism actually is hard.  I've been much 
> better served (though, admittedly, not in Ruby) by trying to get really 
> familiar with the queue paradigm and understanding how to use them in place 
> of traditional locks and threads.
> 
> I think the actual underlying problem here is Queue#apply's rdoc entry.  
> Manipulating a non-thread-safe data structure (which is all of Foundation's 
> collection classes) in an apply is a bug and even worse a conceptual error.  
> Where do you open bugs on the dispatch gem?
> 
> Matt
> 
> On Jan 24, 2011, at 8:00 AM, Alan Skipp wrote:
> 
>> The post was admittedly vague, but was more of an idea about a general 
>> purpose thread safe array class (in principle, this could apply to any 
>> mutable class). Perhaps implemented as a module that would redirect all 
>> method calls through a serial dispatch queue. This would mean that the array 
>> (or other mutable collection) could be mutated from multiple threads/queues 
>> without fear of bad things happening.
>> 
>> On 24 Jan 2011, at 15:22, Matt Massicotte wrote:
>> 
>>> 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@lists.macosforge.org
>>>>>> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
>>>>> 
>>>>> _______________________________________________
>>>>> MacRuby-devel mailing list
>>>>> MacRuby-devel@lists.macosforge.org
>>>>> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
>>>> 
>>>> _______________________________________________
>>>> MacRuby-devel mailing list
>>>> MacRuby-devel@lists.macosforge.org
>>>> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
>>> 
>>> _______________________________________________
>>> MacRuby-devel mailing list
>>> MacRuby-devel@lists.macosforge.org
>>> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
>> 
>> _______________________________________________
>> MacRuby-devel mailing list
>> MacRuby-devel@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/f4957820/attachment.bin>
> 
> ------------------------------
> 
> _______________________________________________
> MacRuby-devel mailing list
> MacRuby-devel@lists.macosforge.org
> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
> 
> 
> End of MacRuby-devel Digest, Vol 35, Issue 61
> *********************************************
_______________________________________________
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel

Reply via email to