Project

General

Profile

Actions

Feature #6694

open

Thread.new without block.

Feature #6694: Thread.new without block.

Added by ko1 (Koichi Sasada) over 13 years ago. Updated almost 8 years ago.

Status:
Assigned
Target version:
-
[ruby-dev:45910]

Description

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.


Related issues 2 (0 open2 closed)

Actions

Also available in: PDF Atom