concurrent-ruby icon indicating copy to clipboard operation
concurrent-ruby copied to clipboard

Deadlock in Concurrent::Array's on non-MRI

Open eregon opened this issue 8 years ago • 4 comments

  • concurrent-ruby version: 1.0.4
  • concurrent-ruby-ext installed: no
  • concurrent-ruby-edge used: no

Take the following code: https://gist.github.com/eregon/323890bfff539f8a33f66d8b2f02cc99 Of course, its purpose is to create a deadlock but it means any method taking a block on Array can cause a deadlock as long as:

  • 2+ threads use 2+ Concurrent::Array by calling a method taking a block
  • inside the blocks, the threads call any method taking on another Concurrent::Array

This seems not such a rare scenario, as it is frequent to call methods in a block that do not only involve the current Array.

The deadlock does not happen on MRI, as it uses a single global lock and concurrent-ruby just subclasses ::Array. It does happen on all other implementations though, like JRuby, Rubinius and TruffleRuby.

The documentation says:

A thread-safe subclass of Array.
This version locks against the object itself for every method call,
ensuring only one thread can be reading or writing at a time.
This includes iteration methods like #each.

So indeed this might imply the deadlock above, but it's not clear. ensuring only one thread can be reading or writing at a time is also inaccurate on MRI for methods taking a block, as they release the GIL and might switch to another Thread in the middle of e.g. #each.

The same apply for Hash.

Is this behavior intended? Should this be fixed? Should it behave the same on the different implementations?

eregon avatar Feb 02 '17 17:02 eregon

Related to #594

eregon avatar Feb 02 '17 17:02 eregon

I think this is a bug. 1) it should behave the same on all implementations. 2) it's a good practice not to execute user code when a lock is taken on a data structure, in this case to execute the each block while the block is taken

@thedarkone would you have time to work on this?

pitr-ch avatar Feb 12 '17 19:02 pitr-ch

Hi @pitr-ch. I'm a Ruby developer and I want to get more comfortable working with threads so I decided that the best way is by helping and understanding concurrent-ruby. I'm not very experienced with Threads is there any issue that is a good starting point?

GustavoCaso avatar Nov 13 '17 06:11 GustavoCaso

@GustavoCaso Thanks you very much for you interest. I'll welcome your help. Perhaps you could have a look at https://github.com/ruby-concurrency/concurrent-ruby/issues/670, it would give you opportunity to read the documentation for the given c-r parts and try it for yourself a with a replacement service you need to find (it can be anything not just finance) for fixing the doc.

pitr-ch avatar Nov 18 '17 11:11 pitr-ch