Issue #6694 has been updated by brixen (Brian Ford). ko1 (Koichi Sasada) wrote: > (2012/07/20 22:42), brixen (Brian Ford) wrote: > > I don't think I understand your question. To summarize my objection to this proposed API change: Thread stack size should be something set at the VM level completely outside of Ruby code. Ruby code should not be coupled with implementation details. > > I think I understand your question. And your question should be > discussed on ticket 6695 <https://bugs.ruby-lang.org/issues/6695>. > > My proposal is *not* adding "initial stack size parameter for thread > creation". > It is only "configurable thread parameters". More general framework. > > I propose "stack size parameter" at next ticket (using this ticket): > <https://bugs.ruby-lang.org/issues/6695> > > > This ticket (6694): > Change Thread.new() API to accept any initial parameters. > > Next ticket (6695): > New parameters including stack size (machine stack size and VM > stack size). > Not only stack size, but also "name" and others. > I think "name" is killer usage of this ticket (6694). Thread#name doesn't require a new API for Thread.new. Thread#name makes sense as something that can be set any time. The pthread_create() design rationale referenced by Urabe-san is relevant to this proposed API. For the same reasons discussed there, I would object to this API change. I don't see any real need for this API if stack size is not one of the things being set. Hence, this API proposal really looks like just a thin rationale for that proposal. Cheers, Brian ---------------------------------------- Feature #6694: Thread.new without block. https://bugs.ruby-lang.org/issues/6694#change-28233 Author: ko1 (Koichi Sasada) Status: Assigned Priority: Normal Assignee: ko1 (Koichi Sasada) Category: core Target version: 2.0.0 =begin = Abstract Support Thread.new() without block. Before: Thread.new(params...){|thread_local_params| ...} After: Thread.new(proc: lambda{|tl_params...| ...}, args: params..., other_thread_config...) = Background Thread.new creates new Thread object and run passed block in another thread immediately. Thread.new can receive parameters and pass all parameters to block. Thread.new(a, b, c) do |ta, tb, tc| # ta, tb, tc is thread local } There are some request to specify thread configurations such as stack size described in [Ruby 1.9 - Feature #3187] (in this case, stack size for Fiber.new). However, we have no way to pass such thread configuration on the Thread.new(). = Proposal Allow Thread.new() without block. A block will be passed with proc parameter. Passed arguments will be passed with args parameter. # ex1 Thread.new(){...} #=> Thread.new(proc: -> {...}) # ex2 Thread.new(a, b, c){|ta, tb, tc| ...} #=> Thread.new(proc: ->(ta, tb, tc){ ... }, params: [a, b, c]) If you want to specify stack size, then: Thread.new(stack_size: 4096, proc: proc{...}, args: [a, b, c]) Note that I'll make another ticket for thread (and fiber) creation parameters. This change can be described with the following pseudo code: def Thread.new(*args, &block) if block Thread.new_orig(*args, &block) else config = args[0] || raise ArgumentError stack_size = config[:stack_size] # ... and process another parameters Thread.new_orig(*config[:args], &config[:proc]) end end = Another proposal On the [ruby-core:43385], Nahi-san proposed that if no block given on Thread.new(), then create "waiting" thread. Thread#run kicks waiting thread with parameters. th = Thread.new(thread_config_params) ... th.run(params){|thread_local_params| ... } We can combine with proc: parameter and this proposal. If Thread.new() doesn't have block and proc: parameter, then making a waiting thread. NOTE: Because we have already Thread#run, Thread#start is better than Thread#run? = Note I don't make any survey on other languages. Please give us your comments. =end -- http://bugs.ruby-lang.org/