unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Po Lu <luangruo@yahoo.com>
To: Philip Kaludercic <philipk@posteo.net>
Cc: Ergus <spacibba@aol.com>,  emacs-devel@gnu.org
Subject: Re: Multithread or multiprocess in emacs??
Date: Mon, 17 Apr 2023 21:58:59 +0800	[thread overview]
Message-ID: <87jzyahaos.fsf@yahoo.com> (raw)
In-Reply-To: <87354yiq8q.fsf@posteo.net> (Philip Kaludercic's message of "Mon,  17 Apr 2023 13:37:41 +0000")

Philip Kaludercic <philipk@posteo.net> writes:

> Ergus <spacibba@aol.com> writes:
>
>> Hi:
>>
>> Very recently I have seen a code in an elpa package that starts async
>> subprocesses; but instead of using make-process the package uses
>> make-thread + process-file. This was to reduce the latency and some
>> lagging (not evident in my system, but apparently it annoyed the
>> package's author).
>>
>> So, my question is now: Has anyone measured the overhead created by
>> make-process in critical parts of the code like flymake checkers, or
>> ispell? and compared with creating new threads?
>>
>> If this is somehow significant maybe we may consider adding a helper
>> thread or thread-pool for some purposes as now the C11 standard has the
>> threads.h header.
>
> Note that C11 threads are controversial[0], but also optional.

Indeed, threads cannot be relied on to exist in Standard C.  Many
compilers don't support C11 anyway, and even less come with a C11
runtime.

Threads are an optional feature in Emacs too.

> Also, I might be mistaken, but shouldn't Pthreads in some form be
> available on platforms that Emacs runs on?  Also, see (elisp) C
> Dialect.

pthreads are not always suitable for complex language runtimes.  But
even that is besides the point.

The big problem with threads is to make an Emacs capable of running more
than one thread at the same time work safely.  Consider this pattern,
which is very common throughout Emacs:

  Lisp_Object cons;
  struct Lisp_String *sp;

  cons = < some cons >;

  CHECK_STRING (XCAR (cons));
  sp = XSTRING (XCAR (cons));

even assuming that reads and writes of Lisp_Object are coherently
propagated between threads (which is not true on some kinds of CPU, and
also --with-wide-int configurations in general), there is still the
problem of `XCAR (cons)' changing to something other than a string
between `CHECK_STRING' and `XSTRING'.

So you will first have to get rid of all of these not-so-constant
subexpressions.

Next, you will have to interlock everything that is reasonable to use
from multiple threads at the same time, such as all of alloc.c,
editfns.c, fileio.c, and so on.  And do so correctly.  Then, you will
have to make everything else report an error when used outside the main
thread.

Finally, you will have to make the resulting Emacs with all of the extra
interlocking overhead run almost as fast as it used to.

  (Not to mention all the Lisp that currently assumes two threads
   can't run at the same time.  Just avoid thinking about that for
   now.)

This work will require a lot of manpower and time!  Just count the
number of years it took to interlock the Unix kernel (which, like Emacs,
previously used set-priority-level to handle the limited amount of
reentrancy present when running on a single CPU with interrupts.)



      reply	other threads:[~2023-04-17 13:58 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <7w4yjuxtu6rm325oeddtl3fu4oe64fsarru3s4fnh7on5m7udl.ref@wzxqo5pm6es7>
2023-04-16 20:50 ` Multithread or multiprocess in emacs?? Ergus
2023-04-17  2:26   ` Eli Zaretskii
2023-04-17 13:37   ` Philip Kaludercic
2023-04-17 13:58     ` Po Lu [this message]

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/emacs/

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

  git send-email \
    --in-reply-to=87jzyahaos.fsf@yahoo.com \
    --to=luangruo@yahoo.com \
    --cc=emacs-devel@gnu.org \
    --cc=philipk@posteo.net \
    --cc=spacibba@aol.com \
    /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.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

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).