Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

pthread.js

pthread.js is a pthread-inspired JavaScript library for Node.js and browsers. It exposes pthread-style names, selects the strongest runtime available, and downscales when shared memory is missing or blocked.

Runtime selection is automatic:

  1. shared-memory: SharedArrayBuffer plus blocking Atomics.
  2. message-worker: Web Workers or Node.js worker_threads without shared memory.
  3. promise: same-event-loop scheduling for restricted runtimes.

Fallback runtimes cannot exactly reproduce native blocking semantics. In those modes, operations that would block in C can return a Promise<number>.

Table of Contents

Install

npm install pthread.js

JavaScript Usage

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(asyncvalue=>{returnvalue*2;},21);console.log(awaitthread.pthread_join());

Worker Usage

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(newURL('./worker.mjs',import.meta.url),{left: 2,right: 3});console.log(awaitthread.pthread_join());
import{pthread_worker_main}from'pthread.js/worker';pthread_worker_main(asyncarg=>{returnarg.left+arg.right;});

Web Usage

Use pthread.js directly from jsDelivr with one <script> tag:

<buttonid="run">Run</button><outputid="result"></output><scripttype="module">importThread,{detectRuntime}from'https://cdn.jsdelivr.net/npm/pthread.js@0.2.5/index.js';constbutton=document.querySelector('#run');constresult=document.querySelector('#result');button.addEventListener('click',async()=>{constthread=newThread();awaitthread.pthread_create(asyncname=>`hello ${name}`,'browser');result.textContent=awaitthread.pthread_join();console.table(detectRuntime());});</script>

The browser automatically downscales. If SharedArrayBuffer and blocking Atomics are available, pthread.js uses the shared-memory backend. If not, it uses Web Workers. If workers are not available, it uses the promise backend.

To enable the strongest browser backend, serve your app with cross-origin isolation headers:

Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp

In Express:

app.use((req,res,next)=>{res.setHeader('Cross-Origin-Opener-Policy','same-origin');res.setHeader('Cross-Origin-Embedder-Policy','require-corp');next();});

Check the selected backend at runtime:

importThread,{detectRuntime}from'https://cdn.jsdelivr.net/npm/pthread.js@0.2.5/index.js';console.table(detectRuntime());constthread=newThread();console.log(thread.backend.kind);

C pthread vs pthread.js

Native pthread in C:

#include<pthread.h>#include<stdio.h>void*run(void*arg) {
int*value=arg;
*value=*value*2;
returnarg;
}
intmain(void) {
pthread_tthread;
intvalue=21;
pthread_create(&thread, NULL, run, &value);
pthread_join(thread, NULL);
printf("%d\n", value);
return0;
}

pthread.js:

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(asyncvalue=>value*2,21);constvalue=awaitthread.pthread_join();console.log(value);

Native pthread synchronizes real OS threads and memory. pthread.js uses JavaScript workers when the platform allows it, and falls back to cooperative promises when it does not. The API shape is familiar, but JavaScript cannot expose every POSIX scheduling, signal, priority, or process-shared behavior exactly.

API Coverage

Implemented or simulated groups:

GroupFunctions
Thread lifecyclepthread_create, pthread_join, pthread_exit, pthread_detach, pthread_self, pthread_equal
Cancellationpthread_cancel, pthread_setcancelstate, pthread_setcanceltype, pthread_testcancel, pthread_cleanup_push, pthread_cleanup_pop
Mutexespthread_mutex_init, pthread_mutex_destroy, pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_timedlock, pthread_mutex_unlock
Mutex attributespthread_mutexattr_init, pthread_mutexattr_destroy, pthread_mutexattr_gettype, pthread_mutexattr_settype, pthread_mutexattr_getpshared, pthread_mutexattr_setpshared, pthread_mutexattr_getprotocol, pthread_mutexattr_setprotocol, pthread_mutexattr_getprioceiling, pthread_mutexattr_setprioceiling
Conditionspthread_cond_init, pthread_cond_destroy, pthread_cond_wait, pthread_cond_timedwait, pthread_cond_signal, pthread_cond_broadcast
Condition attributespthread_condattr_init, pthread_condattr_destroy, pthread_condattr_getpshared, pthread_condattr_setpshared, pthread_condattr_getclock, pthread_condattr_setclock
Read-write lockspthread_rwlock_init, pthread_rwlock_destroy, pthread_rwlock_rdlock, pthread_rwlock_tryrdlock, pthread_rwlock_wrlock, pthread_rwlock_trywrlock, pthread_rwlock_timedrdlock, pthread_rwlock_timedwrlock, pthread_rwlock_unlock
Read-write attributespthread_rwlockattr_init, pthread_rwlockattr_destroy, pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared, pthread_rwlockattr_getkind_np, pthread_rwlockattr_setkind_np
Thread attributespthread_attr_init, pthread_attr_destroy, pthread_attr_getdetachstate, pthread_attr_setdetachstate, pthread_attr_getschedpolicy, pthread_attr_setschedpolicy, pthread_attr_getschedparam, pthread_attr_setschedparam, pthread_attr_getinheritsched, pthread_attr_setinheritsched, pthread_attr_getscope, pthread_attr_setscope, pthread_attr_getstacksize, pthread_attr_setstacksize, pthread_attr_getstack, pthread_attr_setstack, pthread_attr_getguardsize, pthread_attr_setguardsize, pthread_attr_getstackaddr, pthread_attr_setstackaddr
TLSpthread_key_create, pthread_key_delete, pthread_setspecific, pthread_getspecific
One-time initpthread_once
Barrierspthread_barrier_init, pthread_barrier_destroy, pthread_barrier_wait, pthread_barrierattr_init, pthread_barrierattr_destroy, pthread_barrierattr_getpshared, pthread_barrierattr_setpshared
Spin lockspthread_spin_init, pthread_spin_destroy, pthread_spin_lock, pthread_spin_trylock, pthread_spin_unlock
Semaphoressem_init, sem_destroy, sem_wait, sem_trywait, sem_timedwait, sem_post, sem_getvalue
Scheduling and namespthread_getconcurrency, pthread_setconcurrency, pthread_setschedparam, pthread_getschedparam, pthread_setschedprio, pthread_getcpuclockid, pthread_getname_np, pthread_setname_np
Signals and platform extensionspthread_kill, pthread_sigmask, pthread_atfork, pthread_getaffinity_np, pthread_setaffinity_np, pthread_getattr_np, pthread_attr_getaffinity_np, pthread_attr_setaffinity_np, pthread_getattr_default_np, pthread_setattr_default_np, pthread_timedjoin_np, pthread_tryjoin_np, pthread_clockjoin_np, pthread_yield_np, pthread_is_threaded_np

Functions that cannot be represented in JavaScript return ENOSYS: pthread_mutex_consistent, pthread_mutex_consistent_np, robust mutex attribute helpers, priority ceiling helpers on live mutexes, and POSIX clock-lock variants.

Minimum Runtime Versions

The shared-memory backend also requires cross-origin isolation in browsers: Cross-Origin-Opener-Policy: same-origin and Cross-Origin-Embedder-Policy: require-corp or equivalent.

PlatformShared-memory backendMessage-worker backendPromise backend
Chrome desktop92+61+ as ESM, older with bundling61+ as ESM
Edge desktop92+79+ as ESM79+ as ESM
Firefox desktop79+60+ as ESM60+ as ESM
Safari macOS15.2+10.1+ as ESM10.1+ as ESM
Chrome Android89+61+ as ESM61+ as ESM
Firefox Android79+60+ as ESM60+ as ESM
Safari iOS15.2+10.3+ as ESM10.3+ as ESM
Node.js12.17+12.17+12.17+
Deno1.0+1.0+1.0+
Bun1.0+1.0+1.0+

References: MDN SharedArrayBuffer, MDN Atomics, Chrome SharedArrayBuffer updates, MDN Web Workers, and Node.js worker_threads.

License

MIT. See LICENSE.md.

About

A pthread-inspired JavaScript concurrency library with runtime downscaling for Node.js and browsers.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

pthread.js

pthread.js is a pthread-inspired JavaScript library for Node.js and browsers. It exposes pthread-style names, selects the strongest runtime available, and downscales when shared memory is missing or blocked.

Runtime selection is automatic:

  1. shared-memory: SharedArrayBuffer plus blocking Atomics.
  2. message-worker: Web Workers or Node.js worker_threads without shared memory.
  3. promise: same-event-loop scheduling for restricted runtimes.

Fallback runtimes cannot exactly reproduce native blocking semantics. In those modes, operations that would block in C can return a Promise<number>.

Table of Contents

Install

npm install pthread.js

JavaScript Usage

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(asyncvalue=>{returnvalue*2;},21);console.log(awaitthread.pthread_join());

Worker Usage

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(newURL('./worker.mjs',import.meta.url),{left: 2,right: 3});console.log(awaitthread.pthread_join());
import{pthread_worker_main}from'pthread.js/worker';pthread_worker_main(asyncarg=>{returnarg.left+arg.right;});

Web Usage

Use pthread.js directly from jsDelivr with one <script> tag:

<buttonid="run">Run</button><outputid="result"></output><scripttype="module">importThread,{detectRuntime}from'https://cdn.jsdelivr.net/npm/pthread.js@0.2.5/index.js';constbutton=document.querySelector('#run');constresult=document.querySelector('#result');button.addEventListener('click',async()=>{constthread=newThread();awaitthread.pthread_create(asyncname=>`hello ${name}`,'browser');result.textContent=awaitthread.pthread_join();console.table(detectRuntime());});</script>

The browser automatically downscales. If SharedArrayBuffer and blocking Atomics are available, pthread.js uses the shared-memory backend. If not, it uses Web Workers. If workers are not available, it uses the promise backend.

To enable the strongest browser backend, serve your app with cross-origin isolation headers:

Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp

In Express:

app.use((req,res,next)=>{res.setHeader('Cross-Origin-Opener-Policy','same-origin');res.setHeader('Cross-Origin-Embedder-Policy','require-corp');next();});

Check the selected backend at runtime:

importThread,{detectRuntime}from'https://cdn.jsdelivr.net/npm/pthread.js@0.2.5/index.js';console.table(detectRuntime());constthread=newThread();console.log(thread.backend.kind);

C pthread vs pthread.js

Native pthread in C:

#include<pthread.h>#include<stdio.h>void*run(void*arg) {
int*value=arg;
*value=*value*2;
returnarg;
}
intmain(void) {
pthread_tthread;
intvalue=21;
pthread_create(&thread, NULL, run, &value);
pthread_join(thread, NULL);
printf("%d\n", value);
return0;
}

pthread.js:

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(asyncvalue=>value*2,21);constvalue=awaitthread.pthread_join();console.log(value);

Native pthread synchronizes real OS threads and memory. pthread.js uses JavaScript workers when the platform allows it, and falls back to cooperative promises when it does not. The API shape is familiar, but JavaScript cannot expose every POSIX scheduling, signal, priority, or process-shared behavior exactly.

API Coverage

Implemented or simulated groups:

GroupFunctions
Thread lifecyclepthread_create, pthread_join, pthread_exit, pthread_detach, pthread_self, pthread_equal
Cancellationpthread_cancel, pthread_setcancelstate, pthread_setcanceltype, pthread_testcancel, pthread_cleanup_push, pthread_cleanup_pop
Mutexespthread_mutex_init, pthread_mutex_destroy, pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_timedlock, pthread_mutex_unlock
Mutex attributespthread_mutexattr_init, pthread_mutexattr_destroy, pthread_mutexattr_gettype, pthread_mutexattr_settype, pthread_mutexattr_getpshared, pthread_mutexattr_setpshared, pthread_mutexattr_getprotocol, pthread_mutexattr_setprotocol, pthread_mutexattr_getprioceiling, pthread_mutexattr_setprioceiling
Conditionspthread_cond_init, pthread_cond_destroy, pthread_cond_wait, pthread_cond_timedwait, pthread_cond_signal, pthread_cond_broadcast
Condition attributespthread_condattr_init, pthread_condattr_destroy, pthread_condattr_getpshared, pthread_condattr_setpshared, pthread_condattr_getclock, pthread_condattr_setclock
Read-write lockspthread_rwlock_init, pthread_rwlock_destroy, pthread_rwlock_rdlock, pthread_rwlock_tryrdlock, pthread_rwlock_wrlock, pthread_rwlock_trywrlock, pthread_rwlock_timedrdlock, pthread_rwlock_timedwrlock, pthread_rwlock_unlock
Read-write attributespthread_rwlockattr_init, pthread_rwlockattr_destroy, pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared, pthread_rwlockattr_getkind_np, pthread_rwlockattr_setkind_np
Thread attributespthread_attr_init, pthread_attr_destroy, pthread_attr_getdetachstate, pthread_attr_setdetachstate, pthread_attr_getschedpolicy, pthread_attr_setschedpolicy, pthread_attr_getschedparam, pthread_attr_setschedparam, pthread_attr_getinheritsched, pthread_attr_setinheritsched, pthread_attr_getscope, pthread_attr_setscope, pthread_attr_getstacksize, pthread_attr_setstacksize, pthread_attr_getstack, pthread_attr_setstack, pthread_attr_getguardsize, pthread_attr_setguardsize, pthread_attr_getstackaddr, pthread_attr_setstackaddr
TLSpthread_key_create, pthread_key_delete, pthread_setspecific, pthread_getspecific
One-time initpthread_once
Barrierspthread_barrier_init, pthread_barrier_destroy, pthread_barrier_wait, pthread_barrierattr_init, pthread_barrierattr_destroy, pthread_barrierattr_getpshared, pthread_barrierattr_setpshared
Spin lockspthread_spin_init, pthread_spin_destroy, pthread_spin_lock, pthread_spin_trylock, pthread_spin_unlock
Semaphoressem_init, sem_destroy, sem_wait, sem_trywait, sem_timedwait, sem_post, sem_getvalue
Scheduling and namespthread_getconcurrency, pthread_setconcurrency, pthread_setschedparam, pthread_getschedparam, pthread_setschedprio, pthread_getcpuclockid, pthread_getname_np, pthread_setname_np
Signals and platform extensionspthread_kill, pthread_sigmask, pthread_atfork, pthread_getaffinity_np, pthread_setaffinity_np, pthread_getattr_np, pthread_attr_getaffinity_np, pthread_attr_setaffinity_np, pthread_getattr_default_np, pthread_setattr_default_np, pthread_timedjoin_np, pthread_tryjoin_np, pthread_clockjoin_np, pthread_yield_np, pthread_is_threaded_np

Functions that cannot be represented in JavaScript return ENOSYS: pthread_mutex_consistent, pthread_mutex_consistent_np, robust mutex attribute helpers, priority ceiling helpers on live mutexes, and POSIX clock-lock variants.

Minimum Runtime Versions

The shared-memory backend also requires cross-origin isolation in browsers: Cross-Origin-Opener-Policy: same-origin and Cross-Origin-Embedder-Policy: require-corp or equivalent.

PlatformShared-memory backendMessage-worker backendPromise backend
Chrome desktop92+61+ as ESM, older with bundling61+ as ESM
Edge desktop92+79+ as ESM79+ as ESM
Firefox desktop79+60+ as ESM60+ as ESM
Safari macOS15.2+10.1+ as ESM10.1+ as ESM
Chrome Android89+61+ as ESM61+ as ESM
Firefox Android79+60+ as ESM60+ as ESM
Safari iOS15.2+10.3+ as ESM10.3+ as ESM
Node.js12.17+12.17+12.17+
Deno1.0+1.0+1.0+
Bun1.0+1.0+1.0+

References: MDN SharedArrayBuffer, MDN Atomics, Chrome SharedArrayBuffer updates, MDN Web Workers, and Node.js worker_threads.

License

MIT. See LICENSE.md.

About

A pthread-inspired JavaScript concurrency library with runtime downscaling for Node.js and browsers.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

pthread.js

pthread.js is a pthread-inspired JavaScript library for Node.js and browsers. It exposes pthread-style names, selects the strongest runtime available, and downscales when shared memory is missing or blocked.

Runtime selection is automatic:

  1. shared-memory: SharedArrayBuffer plus blocking Atomics.
  2. message-worker: Web Workers or Node.js worker_threads without shared memory.
  3. promise: same-event-loop scheduling for restricted runtimes.

Fallback runtimes cannot exactly reproduce native blocking semantics. In those modes, operations that would block in C can return a Promise<number>.

Table of Contents

Install

npm install pthread.js

JavaScript Usage

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(asyncvalue=>{returnvalue*2;},21);console.log(awaitthread.pthread_join());

Worker Usage

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(newURL('./worker.mjs',import.meta.url),{left: 2,right: 3});console.log(awaitthread.pthread_join());
import{pthread_worker_main}from'pthread.js/worker';pthread_worker_main(asyncarg=>{returnarg.left+arg.right;});

Web Usage

Use pthread.js directly from jsDelivr with one <script> tag:

<buttonid="run">Run</button><outputid="result"></output><scripttype="module">importThread,{detectRuntime}from'https://cdn.jsdelivr.net/npm/pthread.js@0.2.5/index.js';constbutton=document.querySelector('#run');constresult=document.querySelector('#result');button.addEventListener('click',async()=>{constthread=newThread();awaitthread.pthread_create(asyncname=>`hello ${name}`,'browser');result.textContent=awaitthread.pthread_join();console.table(detectRuntime());});</script>

The browser automatically downscales. If SharedArrayBuffer and blocking Atomics are available, pthread.js uses the shared-memory backend. If not, it uses Web Workers. If workers are not available, it uses the promise backend.

To enable the strongest browser backend, serve your app with cross-origin isolation headers:

Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp

In Express:

app.use((req,res,next)=>{res.setHeader('Cross-Origin-Opener-Policy','same-origin');res.setHeader('Cross-Origin-Embedder-Policy','require-corp');next();});

Check the selected backend at runtime:

importThread,{detectRuntime}from'https://cdn.jsdelivr.net/npm/pthread.js@0.2.5/index.js';console.table(detectRuntime());constthread=newThread();console.log(thread.backend.kind);

C pthread vs pthread.js

Native pthread in C:

#include<pthread.h>#include<stdio.h>void*run(void*arg) {
int*value=arg;
*value=*value*2;
returnarg;
}
intmain(void) {
pthread_tthread;
intvalue=21;
pthread_create(&thread, NULL, run, &value);
pthread_join(thread, NULL);
printf("%d\n", value);
return0;
}

pthread.js:

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(asyncvalue=>value*2,21);constvalue=awaitthread.pthread_join();console.log(value);

Native pthread synchronizes real OS threads and memory. pthread.js uses JavaScript workers when the platform allows it, and falls back to cooperative promises when it does not. The API shape is familiar, but JavaScript cannot expose every POSIX scheduling, signal, priority, or process-shared behavior exactly.

API Coverage

Implemented or simulated groups:

GroupFunctions
Thread lifecyclepthread_create, pthread_join, pthread_exit, pthread_detach, pthread_self, pthread_equal
Cancellationpthread_cancel, pthread_setcancelstate, pthread_setcanceltype, pthread_testcancel, pthread_cleanup_push, pthread_cleanup_pop
Mutexespthread_mutex_init, pthread_mutex_destroy, pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_timedlock, pthread_mutex_unlock
Mutex attributespthread_mutexattr_init, pthread_mutexattr_destroy, pthread_mutexattr_gettype, pthread_mutexattr_settype, pthread_mutexattr_getpshared, pthread_mutexattr_setpshared, pthread_mutexattr_getprotocol, pthread_mutexattr_setprotocol, pthread_mutexattr_getprioceiling, pthread_mutexattr_setprioceiling
Conditionspthread_cond_init, pthread_cond_destroy, pthread_cond_wait, pthread_cond_timedwait, pthread_cond_signal, pthread_cond_broadcast
Condition attributespthread_condattr_init, pthread_condattr_destroy, pthread_condattr_getpshared, pthread_condattr_setpshared, pthread_condattr_getclock, pthread_condattr_setclock
Read-write lockspthread_rwlock_init, pthread_rwlock_destroy, pthread_rwlock_rdlock, pthread_rwlock_tryrdlock, pthread_rwlock_wrlock, pthread_rwlock_trywrlock, pthread_rwlock_timedrdlock, pthread_rwlock_timedwrlock, pthread_rwlock_unlock
Read-write attributespthread_rwlockattr_init, pthread_rwlockattr_destroy, pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared, pthread_rwlockattr_getkind_np, pthread_rwlockattr_setkind_np
Thread attributespthread_attr_init, pthread_attr_destroy, pthread_attr_getdetachstate, pthread_attr_setdetachstate, pthread_attr_getschedpolicy, pthread_attr_setschedpolicy, pthread_attr_getschedparam, pthread_attr_setschedparam, pthread_attr_getinheritsched, pthread_attr_setinheritsched, pthread_attr_getscope, pthread_attr_setscope, pthread_attr_getstacksize, pthread_attr_setstacksize, pthread_attr_getstack, pthread_attr_setstack, pthread_attr_getguardsize, pthread_attr_setguardsize, pthread_attr_getstackaddr, pthread_attr_setstackaddr
TLSpthread_key_create, pthread_key_delete, pthread_setspecific, pthread_getspecific
One-time initpthread_once
Barrierspthread_barrier_init, pthread_barrier_destroy, pthread_barrier_wait, pthread_barrierattr_init, pthread_barrierattr_destroy, pthread_barrierattr_getpshared, pthread_barrierattr_setpshared
Spin lockspthread_spin_init, pthread_spin_destroy, pthread_spin_lock, pthread_spin_trylock, pthread_spin_unlock
Semaphoressem_init, sem_destroy, sem_wait, sem_trywait, sem_timedwait, sem_post, sem_getvalue
Scheduling and namespthread_getconcurrency, pthread_setconcurrency, pthread_setschedparam, pthread_getschedparam, pthread_setschedprio, pthread_getcpuclockid, pthread_getname_np, pthread_setname_np
Signals and platform extensionspthread_kill, pthread_sigmask, pthread_atfork, pthread_getaffinity_np, pthread_setaffinity_np, pthread_getattr_np, pthread_attr_getaffinity_np, pthread_attr_setaffinity_np, pthread_getattr_default_np, pthread_setattr_default_np, pthread_timedjoin_np, pthread_tryjoin_np, pthread_clockjoin_np, pthread_yield_np, pthread_is_threaded_np

Functions that cannot be represented in JavaScript return ENOSYS: pthread_mutex_consistent, pthread_mutex_consistent_np, robust mutex attribute helpers, priority ceiling helpers on live mutexes, and POSIX clock-lock variants.

Minimum Runtime Versions

The shared-memory backend also requires cross-origin isolation in browsers: Cross-Origin-Opener-Policy: same-origin and Cross-Origin-Embedder-Policy: require-corp or equivalent.

PlatformShared-memory backendMessage-worker backendPromise backend
Chrome desktop92+61+ as ESM, older with bundling61+ as ESM
Edge desktop92+79+ as ESM79+ as ESM
Firefox desktop79+60+ as ESM60+ as ESM
Safari macOS15.2+10.1+ as ESM10.1+ as ESM
Chrome Android89+61+ as ESM61+ as ESM
Firefox Android79+60+ as ESM60+ as ESM
Safari iOS15.2+10.3+ as ESM10.3+ as ESM
Node.js12.17+12.17+12.17+
Deno1.0+1.0+1.0+
Bun1.0+1.0+1.0+

References: MDN SharedArrayBuffer, MDN Atomics, Chrome SharedArrayBuffer updates, MDN Web Workers, and Node.js worker_threads.

License

MIT. See LICENSE.md.

About

A pthread-inspired JavaScript concurrency library with runtime downscaling for Node.js and browsers.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

pthread.js

pthread.js is a pthread-inspired JavaScript library for Node.js and browsers. It exposes pthread-style names, selects the strongest runtime available, and downscales when shared memory is missing or blocked.

Runtime selection is automatic:

  1. shared-memory: SharedArrayBuffer plus blocking Atomics.
  2. message-worker: Web Workers or Node.js worker_threads without shared memory.
  3. promise: same-event-loop scheduling for restricted runtimes.

Fallback runtimes cannot exactly reproduce native blocking semantics. In those modes, operations that would block in C can return a Promise<number>.

Table of Contents

Install

npm install pthread.js

JavaScript Usage

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(asyncvalue=>{returnvalue*2;},21);console.log(awaitthread.pthread_join());

Worker Usage

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(newURL('./worker.mjs',import.meta.url),{left: 2,right: 3});console.log(awaitthread.pthread_join());
import{pthread_worker_main}from'pthread.js/worker';pthread_worker_main(asyncarg=>{returnarg.left+arg.right;});

Web Usage

Use pthread.js directly from jsDelivr with one <script> tag:

<buttonid="run">Run</button><outputid="result"></output><scripttype="module">importThread,{detectRuntime}from'https://cdn.jsdelivr.net/npm/pthread.js@0.2.5/index.js';constbutton=document.querySelector('#run');constresult=document.querySelector('#result');button.addEventListener('click',async()=>{constthread=newThread();awaitthread.pthread_create(asyncname=>`hello ${name}`,'browser');result.textContent=awaitthread.pthread_join();console.table(detectRuntime());});</script>

The browser automatically downscales. If SharedArrayBuffer and blocking Atomics are available, pthread.js uses the shared-memory backend. If not, it uses Web Workers. If workers are not available, it uses the promise backend.

To enable the strongest browser backend, serve your app with cross-origin isolation headers:

Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp

In Express:

app.use((req,res,next)=>{res.setHeader('Cross-Origin-Opener-Policy','same-origin');res.setHeader('Cross-Origin-Embedder-Policy','require-corp');next();});

Check the selected backend at runtime:

importThread,{detectRuntime}from'https://cdn.jsdelivr.net/npm/pthread.js@0.2.5/index.js';console.table(detectRuntime());constthread=newThread();console.log(thread.backend.kind);

C pthread vs pthread.js

Native pthread in C:

#include<pthread.h>#include<stdio.h>void*run(void*arg) {
int*value=arg;
*value=*value*2;
returnarg;
}
intmain(void) {
pthread_tthread;
intvalue=21;
pthread_create(&thread, NULL, run, &value);
pthread_join(thread, NULL);
printf("%d\n", value);
return0;
}

pthread.js:

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(asyncvalue=>value*2,21);constvalue=awaitthread.pthread_join();console.log(value);

Native pthread synchronizes real OS threads and memory. pthread.js uses JavaScript workers when the platform allows it, and falls back to cooperative promises when it does not. The API shape is familiar, but JavaScript cannot expose every POSIX scheduling, signal, priority, or process-shared behavior exactly.

API Coverage

Implemented or simulated groups:

GroupFunctions
Thread lifecyclepthread_create, pthread_join, pthread_exit, pthread_detach, pthread_self, pthread_equal
Cancellationpthread_cancel, pthread_setcancelstate, pthread_setcanceltype, pthread_testcancel, pthread_cleanup_push, pthread_cleanup_pop
Mutexespthread_mutex_init, pthread_mutex_destroy, pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_timedlock, pthread_mutex_unlock
Mutex attributespthread_mutexattr_init, pthread_mutexattr_destroy, pthread_mutexattr_gettype, pthread_mutexattr_settype, pthread_mutexattr_getpshared, pthread_mutexattr_setpshared, pthread_mutexattr_getprotocol, pthread_mutexattr_setprotocol, pthread_mutexattr_getprioceiling, pthread_mutexattr_setprioceiling
Conditionspthread_cond_init, pthread_cond_destroy, pthread_cond_wait, pthread_cond_timedwait, pthread_cond_signal, pthread_cond_broadcast
Condition attributespthread_condattr_init, pthread_condattr_destroy, pthread_condattr_getpshared, pthread_condattr_setpshared, pthread_condattr_getclock, pthread_condattr_setclock
Read-write lockspthread_rwlock_init, pthread_rwlock_destroy, pthread_rwlock_rdlock, pthread_rwlock_tryrdlock, pthread_rwlock_wrlock, pthread_rwlock_trywrlock, pthread_rwlock_timedrdlock, pthread_rwlock_timedwrlock, pthread_rwlock_unlock
Read-write attributespthread_rwlockattr_init, pthread_rwlockattr_destroy, pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared, pthread_rwlockattr_getkind_np, pthread_rwlockattr_setkind_np
Thread attributespthread_attr_init, pthread_attr_destroy, pthread_attr_getdetachstate, pthread_attr_setdetachstate, pthread_attr_getschedpolicy, pthread_attr_setschedpolicy, pthread_attr_getschedparam, pthread_attr_setschedparam, pthread_attr_getinheritsched, pthread_attr_setinheritsched, pthread_attr_getscope, pthread_attr_setscope, pthread_attr_getstacksize, pthread_attr_setstacksize, pthread_attr_getstack, pthread_attr_setstack, pthread_attr_getguardsize, pthread_attr_setguardsize, pthread_attr_getstackaddr, pthread_attr_setstackaddr
TLSpthread_key_create, pthread_key_delete, pthread_setspecific, pthread_getspecific
One-time initpthread_once
Barrierspthread_barrier_init, pthread_barrier_destroy, pthread_barrier_wait, pthread_barrierattr_init, pthread_barrierattr_destroy, pthread_barrierattr_getpshared, pthread_barrierattr_setpshared
Spin lockspthread_spin_init, pthread_spin_destroy, pthread_spin_lock, pthread_spin_trylock, pthread_spin_unlock
Semaphoressem_init, sem_destroy, sem_wait, sem_trywait, sem_timedwait, sem_post, sem_getvalue
Scheduling and namespthread_getconcurrency, pthread_setconcurrency, pthread_setschedparam, pthread_getschedparam, pthread_setschedprio, pthread_getcpuclockid, pthread_getname_np, pthread_setname_np
Signals and platform extensionspthread_kill, pthread_sigmask, pthread_atfork, pthread_getaffinity_np, pthread_setaffinity_np, pthread_getattr_np, pthread_attr_getaffinity_np, pthread_attr_setaffinity_np, pthread_getattr_default_np, pthread_setattr_default_np, pthread_timedjoin_np, pthread_tryjoin_np, pthread_clockjoin_np, pthread_yield_np, pthread_is_threaded_np

Functions that cannot be represented in JavaScript return ENOSYS: pthread_mutex_consistent, pthread_mutex_consistent_np, robust mutex attribute helpers, priority ceiling helpers on live mutexes, and POSIX clock-lock variants.

Minimum Runtime Versions

The shared-memory backend also requires cross-origin isolation in browsers: Cross-Origin-Opener-Policy: same-origin and Cross-Origin-Embedder-Policy: require-corp or equivalent.

PlatformShared-memory backendMessage-worker backendPromise backend
Chrome desktop92+61+ as ESM, older with bundling61+ as ESM
Edge desktop92+79+ as ESM79+ as ESM
Firefox desktop79+60+ as ESM60+ as ESM
Safari macOS15.2+10.1+ as ESM10.1+ as ESM
Chrome Android89+61+ as ESM61+ as ESM
Firefox Android79+60+ as ESM60+ as ESM
Safari iOS15.2+10.3+ as ESM10.3+ as ESM
Node.js12.17+12.17+12.17+
Deno1.0+1.0+1.0+
Bun1.0+1.0+1.0+

References: MDN SharedArrayBuffer, MDN Atomics, Chrome SharedArrayBuffer updates, MDN Web Workers, and Node.js worker_threads.

License

MIT. See LICENSE.md.

About

A pthread-inspired JavaScript concurrency library with runtime downscaling for Node.js and browsers.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

pthread.js

pthread.js is a pthread-inspired JavaScript library for Node.js and browsers. It exposes pthread-style names, selects the strongest runtime available, and downscales when shared memory is missing or blocked.

Runtime selection is automatic:

  1. shared-memory: SharedArrayBuffer plus blocking Atomics.
  2. message-worker: Web Workers or Node.js worker_threads without shared memory.
  3. promise: same-event-loop scheduling for restricted runtimes.

Fallback runtimes cannot exactly reproduce native blocking semantics. In those modes, operations that would block in C can return a Promise<number>.

Table of Contents

Install

npm install pthread.js

JavaScript Usage

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(asyncvalue=>{returnvalue*2;},21);console.log(awaitthread.pthread_join());

Worker Usage

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(newURL('./worker.mjs',import.meta.url),{left: 2,right: 3});console.log(awaitthread.pthread_join());
import{pthread_worker_main}from'pthread.js/worker';pthread_worker_main(asyncarg=>{returnarg.left+arg.right;});

Web Usage

Use pthread.js directly from jsDelivr with one <script> tag:

<buttonid="run">Run</button><outputid="result"></output><scripttype="module">importThread,{detectRuntime}from'https://cdn.jsdelivr.net/npm/pthread.js@0.2.5/index.js';constbutton=document.querySelector('#run');constresult=document.querySelector('#result');button.addEventListener('click',async()=>{constthread=newThread();awaitthread.pthread_create(asyncname=>`hello ${name}`,'browser');result.textContent=awaitthread.pthread_join();console.table(detectRuntime());});</script>

The browser automatically downscales. If SharedArrayBuffer and blocking Atomics are available, pthread.js uses the shared-memory backend. If not, it uses Web Workers. If workers are not available, it uses the promise backend.

To enable the strongest browser backend, serve your app with cross-origin isolation headers:

Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp

In Express:

app.use((req,res,next)=>{res.setHeader('Cross-Origin-Opener-Policy','same-origin');res.setHeader('Cross-Origin-Embedder-Policy','require-corp');next();});

Check the selected backend at runtime:

importThread,{detectRuntime}from'https://cdn.jsdelivr.net/npm/pthread.js@0.2.5/index.js';console.table(detectRuntime());constthread=newThread();console.log(thread.backend.kind);

C pthread vs pthread.js

Native pthread in C:

#include<pthread.h>#include<stdio.h>void*run(void*arg) {
int*value=arg;
*value=*value*2;
returnarg;
}
intmain(void) {
pthread_tthread;
intvalue=21;
pthread_create(&thread, NULL, run, &value);
pthread_join(thread, NULL);
printf("%d\n", value);
return0;
}

pthread.js:

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(asyncvalue=>value*2,21);constvalue=awaitthread.pthread_join();console.log(value);

Native pthread synchronizes real OS threads and memory. pthread.js uses JavaScript workers when the platform allows it, and falls back to cooperative promises when it does not. The API shape is familiar, but JavaScript cannot expose every POSIX scheduling, signal, priority, or process-shared behavior exactly.

API Coverage

Implemented or simulated groups:

GroupFunctions
Thread lifecyclepthread_create, pthread_join, pthread_exit, pthread_detach, pthread_self, pthread_equal
Cancellationpthread_cancel, pthread_setcancelstate, pthread_setcanceltype, pthread_testcancel, pthread_cleanup_push, pthread_cleanup_pop
Mutexespthread_mutex_init, pthread_mutex_destroy, pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_timedlock, pthread_mutex_unlock
Mutex attributespthread_mutexattr_init, pthread_mutexattr_destroy, pthread_mutexattr_gettype, pthread_mutexattr_settype, pthread_mutexattr_getpshared, pthread_mutexattr_setpshared, pthread_mutexattr_getprotocol, pthread_mutexattr_setprotocol, pthread_mutexattr_getprioceiling, pthread_mutexattr_setprioceiling
Conditionspthread_cond_init, pthread_cond_destroy, pthread_cond_wait, pthread_cond_timedwait, pthread_cond_signal, pthread_cond_broadcast
Condition attributespthread_condattr_init, pthread_condattr_destroy, pthread_condattr_getpshared, pthread_condattr_setpshared, pthread_condattr_getclock, pthread_condattr_setclock
Read-write lockspthread_rwlock_init, pthread_rwlock_destroy, pthread_rwlock_rdlock, pthread_rwlock_tryrdlock, pthread_rwlock_wrlock, pthread_rwlock_trywrlock, pthread_rwlock_timedrdlock, pthread_rwlock_timedwrlock, pthread_rwlock_unlock
Read-write attributespthread_rwlockattr_init, pthread_rwlockattr_destroy, pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared, pthread_rwlockattr_getkind_np, pthread_rwlockattr_setkind_np
Thread attributespthread_attr_init, pthread_attr_destroy, pthread_attr_getdetachstate, pthread_attr_setdetachstate, pthread_attr_getschedpolicy, pthread_attr_setschedpolicy, pthread_attr_getschedparam, pthread_attr_setschedparam, pthread_attr_getinheritsched, pthread_attr_setinheritsched, pthread_attr_getscope, pthread_attr_setscope, pthread_attr_getstacksize, pthread_attr_setstacksize, pthread_attr_getstack, pthread_attr_setstack, pthread_attr_getguardsize, pthread_attr_setguardsize, pthread_attr_getstackaddr, pthread_attr_setstackaddr
TLSpthread_key_create, pthread_key_delete, pthread_setspecific, pthread_getspecific
One-time initpthread_once
Barrierspthread_barrier_init, pthread_barrier_destroy, pthread_barrier_wait, pthread_barrierattr_init, pthread_barrierattr_destroy, pthread_barrierattr_getpshared, pthread_barrierattr_setpshared
Spin lockspthread_spin_init, pthread_spin_destroy, pthread_spin_lock, pthread_spin_trylock, pthread_spin_unlock
Semaphoressem_init, sem_destroy, sem_wait, sem_trywait, sem_timedwait, sem_post, sem_getvalue
Scheduling and namespthread_getconcurrency, pthread_setconcurrency, pthread_setschedparam, pthread_getschedparam, pthread_setschedprio, pthread_getcpuclockid, pthread_getname_np, pthread_setname_np
Signals and platform extensionspthread_kill, pthread_sigmask, pthread_atfork, pthread_getaffinity_np, pthread_setaffinity_np, pthread_getattr_np, pthread_attr_getaffinity_np, pthread_attr_setaffinity_np, pthread_getattr_default_np, pthread_setattr_default_np, pthread_timedjoin_np, pthread_tryjoin_np, pthread_clockjoin_np, pthread_yield_np, pthread_is_threaded_np

Functions that cannot be represented in JavaScript return ENOSYS: pthread_mutex_consistent, pthread_mutex_consistent_np, robust mutex attribute helpers, priority ceiling helpers on live mutexes, and POSIX clock-lock variants.

Minimum Runtime Versions

The shared-memory backend also requires cross-origin isolation in browsers: Cross-Origin-Opener-Policy: same-origin and Cross-Origin-Embedder-Policy: require-corp or equivalent.

PlatformShared-memory backendMessage-worker backendPromise backend
Chrome desktop92+61+ as ESM, older with bundling61+ as ESM
Edge desktop92+79+ as ESM79+ as ESM
Firefox desktop79+60+ as ESM60+ as ESM
Safari macOS15.2+10.1+ as ESM10.1+ as ESM
Chrome Android89+61+ as ESM61+ as ESM
Firefox Android79+60+ as ESM60+ as ESM
Safari iOS15.2+10.3+ as ESM10.3+ as ESM
Node.js12.17+12.17+12.17+
Deno1.0+1.0+1.0+
Bun1.0+1.0+1.0+

References: MDN SharedArrayBuffer, MDN Atomics, Chrome SharedArrayBuffer updates, MDN Web Workers, and Node.js worker_threads.

License

MIT. See LICENSE.md.

About

A pthread-inspired JavaScript concurrency library with runtime downscaling for Node.js and browsers.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

pthread.js

pthread.js is a pthread-inspired JavaScript library for Node.js and browsers. It exposes pthread-style names, selects the strongest runtime available, and downscales when shared memory is missing or blocked.

Runtime selection is automatic:

  1. shared-memory: SharedArrayBuffer plus blocking Atomics.
  2. message-worker: Web Workers or Node.js worker_threads without shared memory.
  3. promise: same-event-loop scheduling for restricted runtimes.

Fallback runtimes cannot exactly reproduce native blocking semantics. In those modes, operations that would block in C can return a Promise<number>.

Table of Contents

Install

npm install pthread.js

JavaScript Usage

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(asyncvalue=>{returnvalue*2;},21);console.log(awaitthread.pthread_join());

Worker Usage

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(newURL('./worker.mjs',import.meta.url),{left: 2,right: 3});console.log(awaitthread.pthread_join());
import{pthread_worker_main}from'pthread.js/worker';pthread_worker_main(asyncarg=>{returnarg.left+arg.right;});

Web Usage

Use pthread.js directly from jsDelivr with one <script> tag:

<buttonid="run">Run</button><outputid="result"></output><scripttype="module">importThread,{detectRuntime}from'https://cdn.jsdelivr.net/npm/pthread.js@0.2.5/index.js';constbutton=document.querySelector('#run');constresult=document.querySelector('#result');button.addEventListener('click',async()=>{constthread=newThread();awaitthread.pthread_create(asyncname=>`hello ${name}`,'browser');result.textContent=awaitthread.pthread_join();console.table(detectRuntime());});</script>

The browser automatically downscales. If SharedArrayBuffer and blocking Atomics are available, pthread.js uses the shared-memory backend. If not, it uses Web Workers. If workers are not available, it uses the promise backend.

To enable the strongest browser backend, serve your app with cross-origin isolation headers:

Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp

In Express:

app.use((req,res,next)=>{res.setHeader('Cross-Origin-Opener-Policy','same-origin');res.setHeader('Cross-Origin-Embedder-Policy','require-corp');next();});

Check the selected backend at runtime:

importThread,{detectRuntime}from'https://cdn.jsdelivr.net/npm/pthread.js@0.2.5/index.js';console.table(detectRuntime());constthread=newThread();console.log(thread.backend.kind);

C pthread vs pthread.js

Native pthread in C:

#include<pthread.h>#include<stdio.h>void*run(void*arg) {
int*value=arg;
*value=*value*2;
returnarg;
}
intmain(void) {
pthread_tthread;
intvalue=21;
pthread_create(&thread, NULL, run, &value);
pthread_join(thread, NULL);
printf("%d\n", value);
return0;
}

pthread.js:

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(asyncvalue=>value*2,21);constvalue=awaitthread.pthread_join();console.log(value);

Native pthread synchronizes real OS threads and memory. pthread.js uses JavaScript workers when the platform allows it, and falls back to cooperative promises when it does not. The API shape is familiar, but JavaScript cannot expose every POSIX scheduling, signal, priority, or process-shared behavior exactly.

API Coverage

Implemented or simulated groups:

GroupFunctions
Thread lifecyclepthread_create, pthread_join, pthread_exit, pthread_detach, pthread_self, pthread_equal
Cancellationpthread_cancel, pthread_setcancelstate, pthread_setcanceltype, pthread_testcancel, pthread_cleanup_push, pthread_cleanup_pop
Mutexespthread_mutex_init, pthread_mutex_destroy, pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_timedlock, pthread_mutex_unlock
Mutex attributespthread_mutexattr_init, pthread_mutexattr_destroy, pthread_mutexattr_gettype, pthread_mutexattr_settype, pthread_mutexattr_getpshared, pthread_mutexattr_setpshared, pthread_mutexattr_getprotocol, pthread_mutexattr_setprotocol, pthread_mutexattr_getprioceiling, pthread_mutexattr_setprioceiling
Conditionspthread_cond_init, pthread_cond_destroy, pthread_cond_wait, pthread_cond_timedwait, pthread_cond_signal, pthread_cond_broadcast
Condition attributespthread_condattr_init, pthread_condattr_destroy, pthread_condattr_getpshared, pthread_condattr_setpshared, pthread_condattr_getclock, pthread_condattr_setclock
Read-write lockspthread_rwlock_init, pthread_rwlock_destroy, pthread_rwlock_rdlock, pthread_rwlock_tryrdlock, pthread_rwlock_wrlock, pthread_rwlock_trywrlock, pthread_rwlock_timedrdlock, pthread_rwlock_timedwrlock, pthread_rwlock_unlock
Read-write attributespthread_rwlockattr_init, pthread_rwlockattr_destroy, pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared, pthread_rwlockattr_getkind_np, pthread_rwlockattr_setkind_np
Thread attributespthread_attr_init, pthread_attr_destroy, pthread_attr_getdetachstate, pthread_attr_setdetachstate, pthread_attr_getschedpolicy, pthread_attr_setschedpolicy, pthread_attr_getschedparam, pthread_attr_setschedparam, pthread_attr_getinheritsched, pthread_attr_setinheritsched, pthread_attr_getscope, pthread_attr_setscope, pthread_attr_getstacksize, pthread_attr_setstacksize, pthread_attr_getstack, pthread_attr_setstack, pthread_attr_getguardsize, pthread_attr_setguardsize, pthread_attr_getstackaddr, pthread_attr_setstackaddr
TLSpthread_key_create, pthread_key_delete, pthread_setspecific, pthread_getspecific
One-time initpthread_once
Barrierspthread_barrier_init, pthread_barrier_destroy, pthread_barrier_wait, pthread_barrierattr_init, pthread_barrierattr_destroy, pthread_barrierattr_getpshared, pthread_barrierattr_setpshared
Spin lockspthread_spin_init, pthread_spin_destroy, pthread_spin_lock, pthread_spin_trylock, pthread_spin_unlock
Semaphoressem_init, sem_destroy, sem_wait, sem_trywait, sem_timedwait, sem_post, sem_getvalue
Scheduling and namespthread_getconcurrency, pthread_setconcurrency, pthread_setschedparam, pthread_getschedparam, pthread_setschedprio, pthread_getcpuclockid, pthread_getname_np, pthread_setname_np
Signals and platform extensionspthread_kill, pthread_sigmask, pthread_atfork, pthread_getaffinity_np, pthread_setaffinity_np, pthread_getattr_np, pthread_attr_getaffinity_np, pthread_attr_setaffinity_np, pthread_getattr_default_np, pthread_setattr_default_np, pthread_timedjoin_np, pthread_tryjoin_np, pthread_clockjoin_np, pthread_yield_np, pthread_is_threaded_np

Functions that cannot be represented in JavaScript return ENOSYS: pthread_mutex_consistent, pthread_mutex_consistent_np, robust mutex attribute helpers, priority ceiling helpers on live mutexes, and POSIX clock-lock variants.

Minimum Runtime Versions

The shared-memory backend also requires cross-origin isolation in browsers: Cross-Origin-Opener-Policy: same-origin and Cross-Origin-Embedder-Policy: require-corp or equivalent.

PlatformShared-memory backendMessage-worker backendPromise backend
Chrome desktop92+61+ as ESM, older with bundling61+ as ESM
Edge desktop92+79+ as ESM79+ as ESM
Firefox desktop79+60+ as ESM60+ as ESM
Safari macOS15.2+10.1+ as ESM10.1+ as ESM
Chrome Android89+61+ as ESM61+ as ESM
Firefox Android79+60+ as ESM60+ as ESM
Safari iOS15.2+10.3+ as ESM10.3+ as ESM
Node.js12.17+12.17+12.17+
Deno1.0+1.0+1.0+
Bun1.0+1.0+1.0+

References: MDN SharedArrayBuffer, MDN Atomics, Chrome SharedArrayBuffer updates, MDN Web Workers, and Node.js worker_threads.

License

MIT. See LICENSE.md.

About

A pthread-inspired JavaScript concurrency library with runtime downscaling for Node.js and browsers.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

pthread.js

pthread.js is a pthread-inspired JavaScript library for Node.js and browsers. It exposes pthread-style names, selects the strongest runtime available, and downscales when shared memory is missing or blocked.

Runtime selection is automatic:

  1. shared-memory: SharedArrayBuffer plus blocking Atomics.
  2. message-worker: Web Workers or Node.js worker_threads without shared memory.
  3. promise: same-event-loop scheduling for restricted runtimes.

Fallback runtimes cannot exactly reproduce native blocking semantics. In those modes, operations that would block in C can return a Promise<number>.

Table of Contents

Install

npm install pthread.js

JavaScript Usage

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(asyncvalue=>{returnvalue*2;},21);console.log(awaitthread.pthread_join());

Worker Usage

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(newURL('./worker.mjs',import.meta.url),{left: 2,right: 3});console.log(awaitthread.pthread_join());
import{pthread_worker_main}from'pthread.js/worker';pthread_worker_main(asyncarg=>{returnarg.left+arg.right;});

Web Usage

Use pthread.js directly from jsDelivr with one <script> tag:

<buttonid="run">Run</button><outputid="result"></output><scripttype="module">importThread,{detectRuntime}from'https://cdn.jsdelivr.net/npm/pthread.js@0.2.5/index.js';constbutton=document.querySelector('#run');constresult=document.querySelector('#result');button.addEventListener('click',async()=>{constthread=newThread();awaitthread.pthread_create(asyncname=>`hello ${name}`,'browser');result.textContent=awaitthread.pthread_join();console.table(detectRuntime());});</script>

The browser automatically downscales. If SharedArrayBuffer and blocking Atomics are available, pthread.js uses the shared-memory backend. If not, it uses Web Workers. If workers are not available, it uses the promise backend.

To enable the strongest browser backend, serve your app with cross-origin isolation headers:

Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp

In Express:

app.use((req,res,next)=>{res.setHeader('Cross-Origin-Opener-Policy','same-origin');res.setHeader('Cross-Origin-Embedder-Policy','require-corp');next();});

Check the selected backend at runtime:

importThread,{detectRuntime}from'https://cdn.jsdelivr.net/npm/pthread.js@0.2.5/index.js';console.table(detectRuntime());constthread=newThread();console.log(thread.backend.kind);

C pthread vs pthread.js

Native pthread in C:

#include<pthread.h>#include<stdio.h>void*run(void*arg) {
int*value=arg;
*value=*value*2;
returnarg;
}
intmain(void) {
pthread_tthread;
intvalue=21;
pthread_create(&thread, NULL, run, &value);
pthread_join(thread, NULL);
printf("%d\n", value);
return0;
}

pthread.js:

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(asyncvalue=>value*2,21);constvalue=awaitthread.pthread_join();console.log(value);

Native pthread synchronizes real OS threads and memory. pthread.js uses JavaScript workers when the platform allows it, and falls back to cooperative promises when it does not. The API shape is familiar, but JavaScript cannot expose every POSIX scheduling, signal, priority, or process-shared behavior exactly.

API Coverage

Implemented or simulated groups:

GroupFunctions
Thread lifecyclepthread_create, pthread_join, pthread_exit, pthread_detach, pthread_self, pthread_equal
Cancellationpthread_cancel, pthread_setcancelstate, pthread_setcanceltype, pthread_testcancel, pthread_cleanup_push, pthread_cleanup_pop
Mutexespthread_mutex_init, pthread_mutex_destroy, pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_timedlock, pthread_mutex_unlock
Mutex attributespthread_mutexattr_init, pthread_mutexattr_destroy, pthread_mutexattr_gettype, pthread_mutexattr_settype, pthread_mutexattr_getpshared, pthread_mutexattr_setpshared, pthread_mutexattr_getprotocol, pthread_mutexattr_setprotocol, pthread_mutexattr_getprioceiling, pthread_mutexattr_setprioceiling
Conditionspthread_cond_init, pthread_cond_destroy, pthread_cond_wait, pthread_cond_timedwait, pthread_cond_signal, pthread_cond_broadcast
Condition attributespthread_condattr_init, pthread_condattr_destroy, pthread_condattr_getpshared, pthread_condattr_setpshared, pthread_condattr_getclock, pthread_condattr_setclock
Read-write lockspthread_rwlock_init, pthread_rwlock_destroy, pthread_rwlock_rdlock, pthread_rwlock_tryrdlock, pthread_rwlock_wrlock, pthread_rwlock_trywrlock, pthread_rwlock_timedrdlock, pthread_rwlock_timedwrlock, pthread_rwlock_unlock
Read-write attributespthread_rwlockattr_init, pthread_rwlockattr_destroy, pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared, pthread_rwlockattr_getkind_np, pthread_rwlockattr_setkind_np
Thread attributespthread_attr_init, pthread_attr_destroy, pthread_attr_getdetachstate, pthread_attr_setdetachstate, pthread_attr_getschedpolicy, pthread_attr_setschedpolicy, pthread_attr_getschedparam, pthread_attr_setschedparam, pthread_attr_getinheritsched, pthread_attr_setinheritsched, pthread_attr_getscope, pthread_attr_setscope, pthread_attr_getstacksize, pthread_attr_setstacksize, pthread_attr_getstack, pthread_attr_setstack, pthread_attr_getguardsize, pthread_attr_setguardsize, pthread_attr_getstackaddr, pthread_attr_setstackaddr
TLSpthread_key_create, pthread_key_delete, pthread_setspecific, pthread_getspecific
One-time initpthread_once
Barrierspthread_barrier_init, pthread_barrier_destroy, pthread_barrier_wait, pthread_barrierattr_init, pthread_barrierattr_destroy, pthread_barrierattr_getpshared, pthread_barrierattr_setpshared
Spin lockspthread_spin_init, pthread_spin_destroy, pthread_spin_lock, pthread_spin_trylock, pthread_spin_unlock
Semaphoressem_init, sem_destroy, sem_wait, sem_trywait, sem_timedwait, sem_post, sem_getvalue
Scheduling and namespthread_getconcurrency, pthread_setconcurrency, pthread_setschedparam, pthread_getschedparam, pthread_setschedprio, pthread_getcpuclockid, pthread_getname_np, pthread_setname_np
Signals and platform extensionspthread_kill, pthread_sigmask, pthread_atfork, pthread_getaffinity_np, pthread_setaffinity_np, pthread_getattr_np, pthread_attr_getaffinity_np, pthread_attr_setaffinity_np, pthread_getattr_default_np, pthread_setattr_default_np, pthread_timedjoin_np, pthread_tryjoin_np, pthread_clockjoin_np, pthread_yield_np, pthread_is_threaded_np

Functions that cannot be represented in JavaScript return ENOSYS: pthread_mutex_consistent, pthread_mutex_consistent_np, robust mutex attribute helpers, priority ceiling helpers on live mutexes, and POSIX clock-lock variants.

Minimum Runtime Versions

The shared-memory backend also requires cross-origin isolation in browsers: Cross-Origin-Opener-Policy: same-origin and Cross-Origin-Embedder-Policy: require-corp or equivalent.

PlatformShared-memory backendMessage-worker backendPromise backend
Chrome desktop92+61+ as ESM, older with bundling61+ as ESM
Edge desktop92+79+ as ESM79+ as ESM
Firefox desktop79+60+ as ESM60+ as ESM
Safari macOS15.2+10.1+ as ESM10.1+ as ESM
Chrome Android89+61+ as ESM61+ as ESM
Firefox Android79+60+ as ESM60+ as ESM
Safari iOS15.2+10.3+ as ESM10.3+ as ESM
Node.js12.17+12.17+12.17+
Deno1.0+1.0+1.0+
Bun1.0+1.0+1.0+

References: MDN SharedArrayBuffer, MDN Atomics, Chrome SharedArrayBuffer updates, MDN Web Workers, and Node.js worker_threads.

License

MIT. See LICENSE.md.

About

A pthread-inspired JavaScript concurrency library with runtime downscaling for Node.js and browsers.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

pthread.js

pthread.js is a pthread-inspired JavaScript library for Node.js and browsers. It exposes pthread-style names, selects the strongest runtime available, and downscales when shared memory is missing or blocked.

Runtime selection is automatic:

  1. shared-memory: SharedArrayBuffer plus blocking Atomics.
  2. message-worker: Web Workers or Node.js worker_threads without shared memory.
  3. promise: same-event-loop scheduling for restricted runtimes.

Fallback runtimes cannot exactly reproduce native blocking semantics. In those modes, operations that would block in C can return a Promise<number>.

Table of Contents

Install

npm install pthread.js

JavaScript Usage

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(asyncvalue=>{returnvalue*2;},21);console.log(awaitthread.pthread_join());

Worker Usage

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(newURL('./worker.mjs',import.meta.url),{left: 2,right: 3});console.log(awaitthread.pthread_join());
import{pthread_worker_main}from'pthread.js/worker';pthread_worker_main(asyncarg=>{returnarg.left+arg.right;});

Web Usage

Use pthread.js directly from jsDelivr with one <script> tag:

<buttonid="run">Run</button><outputid="result"></output><scripttype="module">importThread,{detectRuntime}from'https://cdn.jsdelivr.net/npm/pthread.js@0.2.5/index.js';constbutton=document.querySelector('#run');constresult=document.querySelector('#result');button.addEventListener('click',async()=>{constthread=newThread();awaitthread.pthread_create(asyncname=>`hello ${name}`,'browser');result.textContent=awaitthread.pthread_join();console.table(detectRuntime());});</script>

The browser automatically downscales. If SharedArrayBuffer and blocking Atomics are available, pthread.js uses the shared-memory backend. If not, it uses Web Workers. If workers are not available, it uses the promise backend.

To enable the strongest browser backend, serve your app with cross-origin isolation headers:

Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp

In Express:

app.use((req,res,next)=>{res.setHeader('Cross-Origin-Opener-Policy','same-origin');res.setHeader('Cross-Origin-Embedder-Policy','require-corp');next();});

Check the selected backend at runtime:

importThread,{detectRuntime}from'https://cdn.jsdelivr.net/npm/pthread.js@0.2.5/index.js';console.table(detectRuntime());constthread=newThread();console.log(thread.backend.kind);

C pthread vs pthread.js

Native pthread in C:

#include<pthread.h>#include<stdio.h>void*run(void*arg) {
int*value=arg;
*value=*value*2;
returnarg;
}
intmain(void) {
pthread_tthread;
intvalue=21;
pthread_create(&thread, NULL, run, &value);
pthread_join(thread, NULL);
printf("%d\n", value);
return0;
}

pthread.js:

importThreadfrom'pthread.js';constthread=newThread();awaitthread.pthread_create(asyncvalue=>value*2,21);constvalue=awaitthread.pthread_join();console.log(value);

Native pthread synchronizes real OS threads and memory. pthread.js uses JavaScript workers when the platform allows it, and falls back to cooperative promises when it does not. The API shape is familiar, but JavaScript cannot expose every POSIX scheduling, signal, priority, or process-shared behavior exactly.

API Coverage

Implemented or simulated groups:

GroupFunctions
Thread lifecyclepthread_create, pthread_join, pthread_exit, pthread_detach, pthread_self, pthread_equal
Cancellationpthread_cancel, pthread_setcancelstate, pthread_setcanceltype, pthread_testcancel, pthread_cleanup_push, pthread_cleanup_pop
Mutexespthread_mutex_init, pthread_mutex_destroy, pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_timedlock, pthread_mutex_unlock
Mutex attributespthread_mutexattr_init, pthread_mutexattr_destroy, pthread_mutexattr_gettype, pthread_mutexattr_settype, pthread_mutexattr_getpshared, pthread_mutexattr_setpshared, pthread_mutexattr_getprotocol, pthread_mutexattr_setprotocol, pthread_mutexattr_getprioceiling, pthread_mutexattr_setprioceiling
Conditionspthread_cond_init, pthread_cond_destroy, pthread_cond_wait, pthread_cond_timedwait, pthread_cond_signal, pthread_cond_broadcast
Condition attributespthread_condattr_init, pthread_condattr_destroy, pthread_condattr_getpshared, pthread_condattr_setpshared, pthread_condattr_getclock, pthread_condattr_setclock
Read-write lockspthread_rwlock_init, pthread_rwlock_destroy, pthread_rwlock_rdlock, pthread_rwlock_tryrdlock, pthread_rwlock_wrlock, pthread_rwlock_trywrlock, pthread_rwlock_timedrdlock, pthread_rwlock_timedwrlock, pthread_rwlock_unlock
Read-write attributespthread_rwlockattr_init, pthread_rwlockattr_destroy, pthread_rwlockattr_getpshared, pthread_rwlockattr_setpshared, pthread_rwlockattr_getkind_np, pthread_rwlockattr_setkind_np
Thread attributespthread_attr_init, pthread_attr_destroy, pthread_attr_getdetachstate, pthread_attr_setdetachstate, pthread_attr_getschedpolicy, pthread_attr_setschedpolicy, pthread_attr_getschedparam, pthread_attr_setschedparam, pthread_attr_getinheritsched, pthread_attr_setinheritsched, pthread_attr_getscope, pthread_attr_setscope, pthread_attr_getstacksize, pthread_attr_setstacksize, pthread_attr_getstack, pthread_attr_setstack, pthread_attr_getguardsize, pthread_attr_setguardsize, pthread_attr_getstackaddr, pthread_attr_setstackaddr
TLSpthread_key_create, pthread_key_delete, pthread_setspecific, pthread_getspecific
One-time initpthread_once
Barrierspthread_barrier_init, pthread_barrier_destroy, pthread_barrier_wait, pthread_barrierattr_init, pthread_barrierattr_destroy, pthread_barrierattr_getpshared, pthread_barrierattr_setpshared
Spin lockspthread_spin_init, pthread_spin_destroy, pthread_spin_lock, pthread_spin_trylock, pthread_spin_unlock
Semaphoressem_init, sem_destroy, sem_wait, sem_trywait, sem_timedwait, sem_post, sem_getvalue
Scheduling and namespthread_getconcurrency, pthread_setconcurrency, pthread_setschedparam, pthread_getschedparam, pthread_setschedprio, pthread_getcpuclockid, pthread_getname_np, pthread_setname_np
Signals and platform extensionspthread_kill, pthread_sigmask, pthread_atfork, pthread_getaffinity_np, pthread_setaffinity_np, pthread_getattr_np, pthread_attr_getaffinity_np, pthread_attr_setaffinity_np, pthread_getattr_default_np, pthread_setattr_default_np, pthread_timedjoin_np, pthread_tryjoin_np, pthread_clockjoin_np, pthread_yield_np, pthread_is_threaded_np

Functions that cannot be represented in JavaScript return ENOSYS: pthread_mutex_consistent, pthread_mutex_consistent_np, robust mutex attribute helpers, priority ceiling helpers on live mutexes, and POSIX clock-lock variants.

Minimum Runtime Versions

The shared-memory backend also requires cross-origin isolation in browsers: Cross-Origin-Opener-Policy: same-origin and Cross-Origin-Embedder-Policy: require-corp or equivalent.

PlatformShared-memory backendMessage-worker backendPromise backend
Chrome desktop92+61+ as ESM, older with bundling61+ as ESM
Edge desktop92+79+ as ESM79+ as ESM
Firefox desktop79+60+ as ESM60+ as ESM
Safari macOS15.2+10.1+ as ESM10.1+ as ESM
Chrome Android89+61+ as ESM61+ as ESM
Firefox Android79+60+ as ESM60+ as ESM
Safari iOS15.2+10.3+ as ESM10.3+ as ESM
Node.js12.17+12.17+12.17+
Deno1.0+1.0+1.0+
Bun1.0+1.0+1.0+

References: MDN SharedArrayBuffer, MDN Atomics, Chrome SharedArrayBuffer updates, MDN Web Workers, and Node.js worker_threads.

License

MIT. See LICENSE.md.

About

A pthread-inspired JavaScript concurrency library with runtime downscaling for Node.js and browsers.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages