unofficial mirror of guile-user@gnu.org 
 help / color / mirror / Atom feed
From: "Aleix Conchillo Flaqué" <aconchillo@gmail.com>
To: Jan Wielkiewicz <tona_kosmicznego_smiecia@interia.pl>
Cc: guile-user <guile-user@gnu.org>
Subject: Re: guile fibers - looking for adivce
Date: Sat, 5 Sep 2020 18:19:49 -0700	[thread overview]
Message-ID: <CA+XASoUXiNK409GOs=DPyonyT1wdgDe3fmdnoJ27ODkSanfthQ@mail.gmail.com> (raw)
In-Reply-To: <20200906024757.58dd34cd@interia.pl>

Hi!

On Sat, Sep 5, 2020 at 3:48 PM Jan Wielkiewicz <
tona_kosmicznego_smiecia@interia.pl> wrote:

> Hello,
>
> I'm still on my way of integrating Guile Fibers and GOOPS, but I
> encountered some weird behavior.
> Say I have an object with with one slot being a vector and two methods
> accessing the vector concurrently/parallelly. The methods
> accessing/editing the vector are time consuming and are meant to be ran
> frequently. Assuming I would like to run the methods on separate
> fibers, how do I make sure the state of the object doesn't
> suddenly change during execution of a method? I would like the methods
> to be able to edit the state of the object, but in a cooperative manner.
>
> The weird behavior I've encountered is that sometimes when running the
> first method (A) and right after starting the second method (B), the
> method B tries to access the vector before the method A finishes its
> job. What should I do to make accessing the vector cooperatively, yet
> to run the time consuming on separate fibers for concurrency?
>
> I was thinking about implementing slots in objects as sending and
> receiving messages instead of regular variables, but still there were
> some problems with the object state.
>
> Could someone explain me what should I do?
>
>
I believe sharing the same object by the two fibers defeats the purpose of
message passing, because with the way you are doing it you find exactly the
problem you are having and the only way to fix this is by using mutexes.
That is, you are trying to use fibers as you would use regular threads
sharing a resource. Instead, there should probably be a main fiber (that
holds the object) and send messages (with the data needed from the object)
to 2 other fibers (those would be your methods A and B).

I haven't used fibers extensively, but I've used Go quite a bit which
follows the same pattern of channels and message passing and this is how
you would do it.

Also, the fibers manual also suggests this approach:
https://github.com/wingo/fibers/wiki/Manual#33-mutation

That said, I might be wrong though.

Hope this helps,

Aleix


  parent reply	other threads:[~2020-09-06  1:19 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-06  0:47 guile fibers - looking for adivce Jan Wielkiewicz
2020-09-06  0:42 ` Zelphir Kaltstahl
2020-09-07 16:34   ` Jan Wielkiewicz
2020-09-06  1:19 ` Aleix Conchillo Flaqué [this message]
2020-09-07 16:56   ` Jan Wielkiewicz
2020-09-08  0:25     ` Aleix Conchillo Flaqué
2020-09-08  7:48       ` Chris Vine
2020-09-08 17:56         ` Aleix Conchillo Flaqué
2020-09-10  1:05       ` Jan Wielkiewicz
2020-09-06 19:26 ` Chris Vine

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/guile/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CA+XASoUXiNK409GOs=DPyonyT1wdgDe3fmdnoJ27ODkSanfthQ@mail.gmail.com' \
    --to=aconchillo@gmail.com \
    --cc=guile-user@gnu.org \
    --cc=tona_kosmicznego_smiecia@interia.pl \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).