It seems your primary question has been answered. I will add: I strongly suggest using a conjunction to lock your mutex; something similar to what I demonstrated in the 'unwind protect' thread, as the alternative is pretty much impossible to get right in the general case.

On Tue, 10 May 2022, Devon McCormick wrote:

Henry,
Here is the MVF - minimum viable failure.  It looks like the culprit is
"read_image" which is just a cover for "readimg_jqtide_".  I'm running
under jconsole.

Set up in a directory with some .JPG files:
  FLS=: 0{"1 dir '*.jpg'
  createThreads 5
  MUTEX=: 10 T. 1    NB. Recursive mutex; either fails.

mtFileWork=: 3 : 0
  tm=. 6!:1''
  while. 0<#FLS do.
      tn=. ":3 T. ''                   NB. Thread number as char
      varnm=. ' '-.~'threadVar',tn
      smoutput 'Thread ',tn,' locking at ',":qts''
      11 T. y
      smoutput 'Thread ',tn,' locked at ',":qts''
      (varnm,' FLS')=: split FLS
      smoutput 'Thread ',tn,' unlocking at ',(":qts''),' for file ',flnm=.
".varnm
      13 T. y
      smoutput 'Thread ',tn,' unlocked at ',":qts''
      #read_image flnm   NB. ¡Fails here!
   end.
   tm=. tm,~6!:1''
NB.EG mtFileWork t. '' MUTEX [ mtFileWork t. '' MUTEX [ mtFileWork t. ''
MUTEX [ mtFileWork t. '' MUTEX [ mtFileWork t. '' MUTEX
)

Any help is appreciated!

Thanks,

Devon

On Tue, May 10, 2022 at 4:46 PM Henry Rich <henryhr...@gmail.com> wrote:

If you can get me a version that fails on Windows I'll look at it.

Henry Rich

On 5/10/2022 4:20 PM, Devon McCormick wrote:
> Hi,
>
> Has anyone had success using the multi-threading mutex primitives?  I've
> had limited success - I'll be presenting some basic routines at NYCJUG
this
> evening (18:00 EDT -
> https://www.meetup.com/J-Dynamic-Functional-Programming/) - but have
been
> unable to run multiple threads on a real-life process without crashing J.
>
> The following simplified demo seems to work OK but the version of this
> where I do actual work crashes - with "Process shell<1> exited abnormally
> with code 5" -  after two to thirty repetitions.
>
>     MUTEX=: 10 T. 0    NB. Fast mutex
>     createThreads=: 3 : '{{ 0 T. '''' }} ^:y]'''''
>     qts=: 6!:0
>     createThreads 5
>     GVAR=: 100?@$1e6                    NB. Initialize global threads
will
> consume
>
> multiLockMsgUnlock=: 3 : 0
>     while. 0<#GVAR do.
>         tn=. ":3 T. ''                   NB. Thread number as char
>         varnm=: ' '-.~'threadVar',tn
>         smoutput 'Thread ',tn,' locking at ',":qts''
>         11 T. y
>         smoutput 'Thread ',tn,' locked at ',":qts''
>         (varnm,' GVAR')=: split GVAR
>         smoutput 'Thread ',tn,' unlocking at ',(":qts''),' with
> ',tn,'=',":".varnm
>         13 T. y
>         smoutput 'Thread ',tn,' unlocked at ',(":qts''),';
#GVAR=',":#GVAR
>      end.
> )
> NB. Start five processes (one line):
> multiLockMsgUnlock t. '' MUTEX [ multiLockMsgUnlock t. '' MUTEX [
> multiLockMsgUnlock t. '' MUTEX [ multiLockMsgUnlock t. '' MUTEX [
> multiLockMsgUnlock t. '' MUTEX
>
> The actual work I'm doing is on files, a list of whose names corresponds
to
> the GVAR vector above.
>
> Any suggestions are welcome.
>
> Cheers,
>
> Devon
>


--
This email has been checked for viruses by AVG.
https://www.avg.com

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm



--

Devon McCormick, CFA

Quantitative Consultant
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to