express-c VS preemptible-thread

Compare express-c vs preemptible-thread and see what are their differences.

express-c

Fast, unopinionated, minimalist web framework for C (by williamcotton)

preemptible-thread

How to preempt threads in user space (by samsquire)
InfluxDB - Power Real-Time Data Analytics at Scale
Get real-time insights from all types of time series data with InfluxDB. Ingest, query, and analyze billions of data points in real-time with unbounded cardinality.
www.influxdata.com
featured
SaaSHub - Software Alternatives and Reviews
SaaSHub helps you find the best software and product alternatives
www.saashub.com
featured
express-c preemptible-thread
7 16
16 23
- -
6.3 5.1
3 months ago 4 months ago
C C
MIT License -
The number of mentions indicates the total number of mentions that we've tracked plus the number of user suggested alternatives.
Stars - the number of stars that a project has on GitHub. Growth - month over month growth in stars.
Activity is a relative number indicating how actively a project is being developed. Recent commits have higher weight than older ones.
For example, an activity of 9.0 indicates that a project is amongst the top 10% of the most actively developed projects that we are tracking.

express-c

Posts with mentions or reviews of express-c. We have used some of these posts to build our list of alternatives and similar projects. The last one was on 2023-06-14.
  • Is Parallel Programming Hard, and, If So, What Can You Do About It? v2023.06.11a
    9 projects | news.ycombinator.com | 14 Jun 2023
    GCD/libdispatch is a fantastic approach to concurrency and you can build and install support for non-Apple operating systems:

    https://github.com/apple/swift-corelibs-libdispatch

    Here’s a simple echo server:

    https://github.com/williamcotton/c_playground/blob/master/sr...

    Here’s a simple multithreaded database pool:

    https://github.com/williamcotton/express-c/blob/master/src/d...

  • A highly intuitive visual guide on how memory allocation works, step by step
    3 projects | news.ycombinator.com | 22 May 2023
    Apache does this! And I do this in my own C web framework:

    https://github.com/williamcotton/express-c/blob/master/deps/...

  • My favorite C compiler flags during development
    3 projects | news.ycombinator.com | 29 Apr 2023
    Unfortunately not all of the sanitizers are working in clang for Apple Silicon machines. For my own CI pipeline I run both Darwin and Linux builds, leaks and valgrind respectively, along with the kitchen sink of compiler sanitizers:

    Here’s the GitHub actions for those platforms and a link to the Makefile:

    GitHub Action:

    https://github.com/williamcotton/express-c/blob/master/.gith...

    Makefile:

    https://github.com/williamcotton/express-c/blob/f2e1dde2f5a7...

  • The two types of C programmers (a provocative thesis)
    2 projects | news.ycombinator.com | 23 Apr 2023
    Lol, yeah, the libdispatch runtime is probably about as big as the Go runtime!

    I think this has a slight advantage in that it uses a memory arena for a per-request bump allocator so it should keep overall memory usage lower.

    The slowest part of all this has to do with Block_copy and the places where I’m very much treating blocks/closures in an OOP type manner.

    This could be fixed by writing a different function that did basically the same thing as Block_copy but for all the “methods” on an “object” in a single pass. But who has time for that? :D

    Here’s more about those performance issues and some text code that show how slow the approach is:

    https://github.com/williamcotton/express-c/tree/master/resea...

  • Software Dark Matter Is the Enemy of Software Transparency
    2 projects | news.ycombinator.com | 13 Nov 2022
    I’ve used an approach to copy only the shared libs from the build container to the production container. This not only gets rid of most of this “dark matter” but results in much smaller containers!

    https://github.com/williamcotton/express-c/blob/master/demo/...

  • Untangling Lifetimes: The Arena Allocator
    2 projects | news.ycombinator.com | 31 Oct 2022
    I use arenas for HTTP request handlers. The JSON built or parsed is only going to be around for the lifetime of the request. It's much simpler and faster to use an arena than to do reference counting wrapped around malloc/free.

    Here's an example where in a commit I swapped in an arena:

    https://github.com/williamcotton/express-c/commit/4ae53f38e3...

preemptible-thread

Posts with mentions or reviews of preemptible-thread. We have used some of these posts to build our list of alternatives and similar projects. The last one was on 2023-07-24.
  • Threads and Goroutines
    4 projects | news.ycombinator.com | 24 Jul 2023
    Thanks for this article.

    I want to combine the benefits of kernel threads with coroutines or goroutines/green threads/lightweight threads. (If anybody knows anything specifically about fibers, I'd appreciate that because I'm not familiar with them.)

    I have a lightweight thread scheduler https://github.com/samsquire/preemptible-thread which is a 1:M:N scheduler (1 scheduler thread, M kernel threads, N lightweight threads) with the lightweight threads being multiplexed on the kernel threads.

    I am working on a multithreaded architecture which I all 3 tier multithreaded architecture. It combines request parallelism with IO and CPU parallelism and intra request parallelism.

    We split kernel threads into three groups: app threads, which run lightweight threads, IO threads (liburing/epoll) and traditional CPU threadpool with work stealing.

    * The IO threads have buffers that other threads can write to to queue up data for sockets.

  • Async rust – are we doing it all wrong?
    9 projects | news.ycombinator.com | 19 Jul 2023
    How would you do control flow and scheduling and parallelism and async efficiently with this code?

    `db.save()`, `download()` are IO intensive whereas `document.query("a")` and `parse` is CPU intensive.

    I think its work diagram looks like this: https://github.com/samsquire/dream-programming-language/blob...

    I've tried to design a multithreaded architecture that is scalable which combines lightweight threads + thread pools for work + control threads for IO epoll or liburing loops:

    Here's the high level diagram:

    https://github.com/samsquire/ideas5/blob/main/NonblockingRun...

    The secret is modelling control flow as a data flow problem and having a simple but efficient scheduler.

    I wrote about schedulers here and binpacking work into time:

    https://github.com/samsquire/ideas4#196-binpacking-work-into...

    I also have a 1:M:N lightweight thread scheduler/multiplexer:

    https://github.com/samsquire/preemptible-thread

  • Coroutines for Go
    5 projects | news.ycombinator.com | 17 Jul 2023
    * I want to keep IO and CPU in flight at all times.

    I think I want this schedule:

    https://user-images.githubusercontent.com/1983701/254083968-...

    I have a toy 1:M:L 1 scheduler thread:M kernel threads:N lightweight threads lightweight scheduler in C, Rust and Java

    https://github.com/samsquire/preemptible-thread

    This lets me switch between tasks and preempt them from user space without assistance at descheduling time.

    I have a simplistic async/await state machine thread pool in Java. My scheduling algorithm is very simple.

    I want things like backpressure, circuit breakers, rate limiting, load shedding, rate adjustment, queuing.

  • Goroutines: The concurrency model we wanted all along
    2 projects | news.ycombinator.com | 7 Jul 2023
    Thanks for this article and to ingve for submitting it.

    Concurrency and async is my favourite topic. I wrote a very simple toy lightweight 1:M:N (1 scheduler:M kernel threads:N lightweight threads) thread scheduler in C, Rust and Java.

    https://github.com/samsquire/preemptible-thread

    It works on the principle that hot loops can be interrupted BY ANOTHER THREAD (the scheduler thread) on a timer, to give lightweight threads a chance to execute.

    What I think I want today though is an extremely rich process/concurrency API that resembles a stream API but for processes. For example, we should be able to create pipelines that can be paused, resumed, forked, merged, drop_while, iterate_until and whatever else would be useful.

  • Coroutines make robot code easy for high schoolers
    9 projects | news.ycombinator.com | 22 Jun 2023
    I really like this.

    Thank you for your comment and sharing.

    I have a lightweight 1:M:N runtime (1 scheduler thread, M kernel threads, N lightweight threads) which preempts by setting hot loops to the limit.

    https://github.com/samsquire/preemptible-thread (Rust, Java and C)

    How do you preempt code that is running?

  • Is Parallel Programming Hard, and, If So, What Can You Do About It? v2023.06.11a
    9 projects | news.ycombinator.com | 14 Jun 2023
    https://github.com/samsquire/ideas5/blob/main/NonblockingRun...

    The design is that we have three groupings of thread types. The application starts up some application threads which are not associated with a request, these service multiconsumer multiproducer thread safe ringbuffers in lightweight threads with a Go-erlang-like lightweight process runtime. (My simple lightweight thread runtime is https://github.com/samsquire/preemptible-thread) We also multiplex multiple network clients sockets across a set number of kernel threads which I call control threads. Their responsibility is to dispatch work to a work stealing thread pool ASAP which has its own group of threads. So we pay a thread synchronization cost ONCE per IO which is the dispatch from the control thread to a thread pool thread. (Presumably this is fast, because the thread pool threads are all looping on a submission queue)

    We split all IO and CPU tasks into two halves: submit and handle reply. I assume you can use liburing or epoll in the control threads. The same with CPU tasks and use ringbuffers to communicate between threads. We can always serve client's requests because we're never blocked on handling someone else's request. The control thread is always unblocked.

    I think this article is good regarding Python's asyncio story:

  • Zig Language Server and Cancellation
    2 projects | news.ycombinator.com | 10 Jun 2023
    I am deeply interested in the multithreading, parallelism, async and coroutine design space and I journal about it everyday in my ideas journal.

    I wrote a toy very simple 1:M kernel threads:N lightweight thread runtime in terrible Rust, C and Java.

    Hot loops use a structure for its limit and looping variable. Then to cancel the loop, you set the looping variable to the limit from a scheduling thread, cancelling the loop. This is used for process switching and scheduling but it can also be used for cancellation.

    Can create very responsive code this way, it's even possible to cancel while (true) loops by replacing them with while (!preempted) {}.

    https://github.com/samsquire/preemptible-thread

    There is potential for a race, but that can be detected and worked around.

  • Notes on my incomplete JIT compiler
    5 projects | /r/ProgrammingLanguages | 20 Apr 2023
    I also have a M:N m kernel threads to N lightweight thread userspace preemptive scheduler at https://github.com/samsquire/preemptible-thread It would be nice to schedule lightweight threads in a JIT compiler. Imagine being capable of running processes similar to BEAM and Go but with JIT.
  • Erlang: More Optimizations in the Compiler and JIT
    4 projects | news.ycombinator.com | 19 Apr 2023
    This is interesting, thank you.

    I really should learn from BEAM and the OTP and learn Erlang. I get the feeling it's super robust and reliable and low maintenance. I wrote a userspace multithreaded scheduler which distributes N lightweight threads to M kernel threads.

    https://github.com/samsquire/preemptible-thread

    I recently wrote a JIT compiler and got lazy compilation of machine code working and I'm nowhere near beginning optimisation

    https://github.com/samsquire/compiler

    How do you write robust software, that doesn't crash when something unexpected goes on?

    I looked at sozo https://github.com/sozu-proxy/sozu

    and I'm thinking how to create something that just stays up and running regardless.

  • Erlang's not about lightweight processes and message passing
    9 projects | news.ycombinator.com | 27 Jan 2023
    I wrote a preemptive 1:M:N scheduler in C, Rust and Java.

    https://github.com/samsquire/preemptible-thread

    It is a 1:M:N scheduler where there is one scheduler thread, M kernel threads and N lightweight threads. I take advantage that loop indexes can be structures and can be modified by other threads. So we can set the thread's looping variable to the limit to end the current loop and pause it and then schedule another thread.

What are some alternatives?

When comparing express-c and preemptible-thread you can also consider the following projects:

c_playground - C Playground

Melang - A script language of time-sharing scheduling coroutine in single thread

multiplix - An operating system kernel for RISC-V and AArch64 SBCs

ideas4 - An Additional 100 Ideas for Computing https://samsquire.github.io/ideas4/

mandelbrot - Simple fractal generator

quickserv - Dangerously user-friendly web server for quick prototyping and hackathons

Hopac - http://hopac.github.io/Hopac/Hopac.html

blech - Blech is a language for developing reactive, real-time critical embedded software.

futhark - :boom::computer::boom: A data-parallel functional programming language

quaint-lang - An experimental statically typed procedural language with first-class resumable functions.

gcc

dream-programming-language - notes on my dream programming language