Don't be hasty. It was a horrible hack. I repent. On 24 Jan 2011, at 16:34, Robert Ash wrote:
> > > > 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 _______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel