Release Manager
poingstudios/godot-admob-plugin
Manage and execute AdMob plugin releases. An agent skill from poingstudios/godot-admob-plugin.
A skill your agent uses when running work off the main thread — WorkerThreadPool, Thread/Mutex/Semaphore, calldeferred, thread-safe scene access, and threaded resource loading
$ npx skills add jame581/GodotPrompter --skill multithreading -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install jame581/GodotPrompter multithreading --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/jame581/GodotPrompter.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/multithreading .claude/skills/multithreading && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "multithreading" agent skill from https://github.com/jame581/GodotPrompter/tree/master/skills/multithreading into .claude/skills/multithreading/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "multithreading", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/jame581/GodotPrompter/tree/master/skills/multithreadingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add jame581/GodotPrompter --skill multithreading -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install jame581/GodotPrompter multithreading --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jame581/GodotPrompter.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/multithreading .agents/skills/multithreading && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "multithreading" agent skill from https://github.com/jame581/GodotPrompter/tree/master/skills/multithreading into .agents/skills/multithreading/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "multithreading", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add jame581/GodotPrompter --skill multithreading -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install jame581/GodotPrompter multithreading --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jame581/GodotPrompter.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/multithreading .cursor/skills/multithreading && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "multithreading" agent skill from https://github.com/jame581/GodotPrompter/tree/master/skills/multithreading into .cursor/skills/multithreading/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "multithreading", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/jame581/GodotPrompter.git --path skills/multithreading--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add jame581/GodotPrompter --skill multithreading -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install jame581/GodotPrompter multithreading --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jame581/GodotPrompter.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/multithreading .gemini/skills/multithreading && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "multithreading" agent skill from https://github.com/jame581/GodotPrompter/tree/master/skills/multithreading into .gemini/skills/multithreading/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "multithreading", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install jame581/GodotPrompter multithreadingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add jame581/GodotPrompter --skill multithreading -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/jame581/GodotPrompter.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/multithreading .github/skills/multithreading && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "multithreading" agent skill from https://github.com/jame581/GodotPrompter/tree/master/skills/multithreading into .github/skills/multithreading/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "multithreading", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add jame581/GodotPrompter --skill multithreading -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install jame581/GodotPrompter multithreading --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jame581/GodotPrompter.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/multithreading .opencode/skills/multithreading && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "multithreading" agent skill from https://github.com/jame581/GodotPrompter/tree/master/skills/multithreading into .opencode/skills/multithreading/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "multithreading", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
multithreadingA skill your agent uses when running work off the main thread — WorkerThreadPool, Thread/Mutex/Semaphore, calldeferred, thread-safe scene access, and threaded resource loading
Multithreading is an agent skill from jame581/GodotPrompter. Use when running work off the main thread — WorkerThreadPool, Thread/Mutex/Semaphore, calldeferred, thread-safe scene access, and threaded resource loading
Its SKILL.md is about 2.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/pitfalls.md`).
It sits in Game Development, covering Async programming and Game development. It works with Godot and C#. The repository describes itself as: Agentic skills framework for Godot 4.x. Domain-specific skills for AI coding agents (Claude Code, Copilot, Antigravity, Cursor). The licence is MIT.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 1e7d79d. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are csharp and gdscript).
From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
github.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Multithreading loads about 2.7k tokens when it runs, and up to ~3.8k if it reads all its reference files. Until then it costs about 43 tokens; SKILL.md has 625 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from jame581/GodotPrompter at commit 1e7d79d, republished under its MIT licence (© jame581). 625 words, ~2,747 tokens.
.claude/skills/multithreading/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Run expensive work off the main thread without corrupting the scene tree. Prefer WorkerThreadPool for short parallel jobs; reach for Thread/Mutex/Semaphore only when you need a long-lived worker.
Related skills: godot-optimization for profiling before threading, assets-pipeline for asset import, csharp-godot for C# specifics, gdscript-advanced for async/await pitfalls.
The main thread owns the scene tree — interacting with the active scene tree is not thread-safe. Observe these doc-sourced rules:
Rendering > Driver > Thread Model = Separate, Physics > {2D,3D} > Run on Separate Thread). Servers handle thousands of thread-driven instances well.Navigation > Pathfinding > Max Threads.Array/Dictionary: reading/writing existing elements across threads is OK; resizing (add/remove) needs a Mutex.add_child.call_deferred() — only with a single loader thread (multiple threads risk tweaking the same cached resource → crashes).Golden rule: Mutate the scene tree only on the main thread. From a worker, hand results back with
call_deferred/set_deferred.
WorkerThreadPool is a global singleton with threads allocated at startup. A regular task (add_task) runs on one worker; a group task (add_group_task) is distributed across workers, calling the Callable repeatedly for each element index — great for iterating many elements. Every task must be waited on (wait_for_task_completion / wait_for_group_task_completion) or its allocated resources leak. Distributing cheap work can hurt performance — only use it for genuinely expensive work.
var enemies = [] # Filled with enemies elsewhere.
func process_enemy_ai(enemy_index):
var processed_enemy = enemies[enemy_index]
# Expensive per-enemy logic...
func _process(delta):
var task_id = WorkerThreadPool.add_group_task(process_enemy_ai, enemies.size())
# ... other main-thread work ...
WorkerThreadPool.wait_for_group_task_completion(task_id)
# Safe to read results now.private List<Node> _enemies = new(); // Filled with enemies elsewhere.
private void ProcessEnemyAI(int enemyIndex)
{
Node processedEnemy = _enemies[enemyIndex];
// Expensive per-enemy logic...
}
public override void _Process(double delta)
{
long taskId = WorkerThreadPool.AddGroupTask(Callable.From<int>(ProcessEnemyAI), _enemies.Count);
// ... other main-thread work ...
WorkerThreadPool.WaitForGroupTaskCompletion(taskId);
// Safe to read results now.
}This relies on the element count staying constant during the multithreaded part.
Real signatures: Thread.start(callable: Callable, priority := PRIORITY_NORMAL), wait_to_finish() (blocks; join before free), is_alive(). Mutex is reentrant (lock/unlock/try_lock). Semaphore exposes wait() / post(count := 1).
The canonical semaphore producer/consumer + clean-shutdown idiom:
var counter := 0
var mutex: Mutex
var semaphore: Semaphore
var thread: Thread
var exit_thread := false
func _ready():
mutex = Mutex.new()
semaphore = Semaphore.new()
thread = Thread.new()
thread.start(_thread_function)
func _thread_function():
while true:
semaphore.wait() # Block until there is work.
mutex.lock()
var should_exit = exit_thread
mutex.unlock()
if should_exit:
break
mutex.lock()
counter += 1
mutex.unlock()
func increment_counter():
semaphore.post() # Wake the worker.
func _exit_tree():
mutex.lock()
exit_thread = true
mutex.unlock()
semaphore.post() # Unblock so it can see exit_thread.
thread.wait_to_finish() # Join.Godot.Mutex/Godot.Semaphore also exist, but System.Threading is idiomatic in C#:
using Godot;
using System.Threading;
public partial class Worker : Node
{
private int _counter;
private readonly object _lock = new();
private readonly SemaphoreSlim _semaphore = new(0);
private Thread _thread;
private volatile bool _exitThread;
public override void _Ready()
{
_thread = new Thread(ThreadFunction) { IsBackground = true };
_thread.Start();
}
private void ThreadFunction()
{
while (true)
{
_semaphore.Wait(); // Block until there is work.
if (_exitThread) break;
lock (_lock) { _counter++; }
}
}
public void IncrementCounter() => _semaphore.Release(); // Wake the worker.
public override void _ExitTree()
{
_exitThread = true;
_semaphore.Release(); // Unblock so it can see _exitThread.
_thread.Join(); // Join.
}
}Thread creation is slow (especially on Windows) — pre-create before heavy work, not just-in-time. Over-locking mutexes is also costly.
# Unsafe from a worker thread:
world.add_child(enemy)
# Safe:
world.add_child.call_deferred(enemy)// Unsafe from a worker thread:
world.AddChild(enemy);
// Safe — use the MethodName StringName constant, NOT "AddChild":
world.CallDeferred(Node.MethodName.AddChild, enemy);In C#, CallDeferred("AddChild") fails — the deferred/Call/Connect APIs use Godot's snake_case names. Prefer the Node.MethodName.* constants (avoids the pitfall and an allocation).
ResourceLoader.load_threaded_request(path) starts the load. Poll load_threaded_get_status(path, progress) each frame (progress[0] is the 0–1 ratio); on THREAD_LOAD_LOADED call load_threaded_get(path). load_threaded_get blocks like load() if the load is not finished — always poll first. Statuses: THREAD_LOAD_INVALID_RESOURCE / THREAD_LOAD_IN_PROGRESS / THREAD_LOAD_FAILED / THREAD_LOAD_LOADED.
const SCENE_PATH := "res://enemy.tscn"
var _progress: Array = []
func _ready():
ResourceLoader.load_threaded_request(SCENE_PATH)
func _process(_delta):
var status := ResourceLoader.load_threaded_get_status(SCENE_PATH, _progress)
match status:
ResourceLoader.THREAD_LOAD_IN_PROGRESS:
$ProgressBar.value = _progress[0] * 100.0
ResourceLoader.THREAD_LOAD_LOADED:
var scene: PackedScene = ResourceLoader.load_threaded_get(SCENE_PATH)
add_child(scene.instantiate())
set_process(false)
ResourceLoader.THREAD_LOAD_FAILED, ResourceLoader.THREAD_LOAD_INVALID_RESOURCE:
push_error("Threaded load failed: %s" % SCENE_PATH)
set_process(false)private const string ScenePath = "res://enemy.tscn";
private readonly Godot.Collections.Array _progress = new();
public override void _Ready() => ResourceLoader.LoadThreadedRequest(ScenePath);
public override void _Process(double delta)
{
var status = ResourceLoader.LoadThreadedGetStatus(ScenePath, _progress);
switch (status)
{
case ResourceLoader.ThreadLoadStatus.InProgress:
GetNode<ProgressBar>("ProgressBar").Value = (double)_progress[0] * 100.0;
break;
case ResourceLoader.ThreadLoadStatus.Loaded:
var scene = (PackedScene)ResourceLoader.LoadThreadedGet(ScenePath);
AddChild(scene.Instantiate());
SetProcess(false);
break;
case ResourceLoader.ThreadLoadStatus.Failed:
case ResourceLoader.ThreadLoadStatus.InvalidResource:
GD.PushError($"Threaded load failed: {ScenePath}");
SetProcess(false);
break;
}
}Godot 4.7+: 4.7 shipped several threaded-load correctness fixes —
load_threaded_get()deadlocks (GH-119757, GH-120077), a race inload_threaded_request()(GH-118824), and resources returned byload_threaded_get()never being unloaded (GH-119394). No API change; if you carry workarounds for rare threaded-load hangs or leaks from earlier versions, re-test on 4.7 before keeping them. The poll-before-get rule above still applies.
In C#, prefer System.Threading.Tasks.Task.Run / async-await for fire-and-forget CPU work; never touch Godot objects or await ToSignal(...) from a background thread — marshal results back with CallDeferred. Use WorkerThreadPool when you want Godot's pool and engine integration; use Task when you want .NET idioms. (GDScript users: use WorkerThreadPool or Thread from the sections above.)
public override void _Process(double delta)
{
if (Input.IsActionJustPressed("compute"))
{
_ = System.Threading.Tasks.Task.Run(() =>
{
int result = ExpensiveComputation(); // Pure CPU work, no Godot objects.
CallDeferred(MethodName.OnComputed, result); // Marshal back to main thread.
});
}
}
private void OnComputed(int result) => GD.Print($"Done: {result}");Deeper: see Pitfalls & deadlocks for data races, the
ERR_BUSYnested-wait deadlock, and when threading hurts.
call_deferred / set_deferred)WorkerThreadPool task is waited on (wait_for_*_completion)Mutex / lock; container resizes are lockedwait_to_finish / Join) before the owning node freesload_threaded_get© jame581, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (references) in skills/multithreading of jame581/GodotPrompter.
Open the folder on GitHubat commit 1e7d79d
Multithreading next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Multithreading this skilljame581/GodotPrompter | 792 | — | ~2.7k | Automated safety check: Pass | MIT | |
| Release Managerpoingstudios/godot-admob-plugin | 631 | — | ~357 | Automated safety check: Pass | MIT | |
| Godot Admob App Openpoingstudios/godot-admob-plugin | 631 | — | ~1k | Automated safety check: Pass | MIT | |
| Godot Admob Bannerpoingstudios/godot-admob-plugin | 631 | — | ~718 | Automated safety check: Pass | MIT | |
| Godot Admob Get Startedpoingstudios/godot-admob-plugin | 631 | — | ~1k | Automated safety check: Pass | MIT | |
| Godot Admob Interstitialpoingstudios/godot-admob-plugin | 631 | — | ~1.1k | Automated safety check: Pass | MIT |
poingstudios/godot-admob-plugin
Manage and execute AdMob plugin releases. An agent skill from poingstudios/godot-admob-plugin.
poingstudios/godot-admob-plugin
Provides instructions to implement, load, show, and destroy App Open ads (shown on application startup or app resume) in GDScript and C.
poingstudios/godot-admob-plugin
Provides instructions to implement, load, and destroy banner ads (AdView) using custom or adaptive sizes in GDScript and C.
poingstudios/godot-admob-plugin
Provides instructions to initialize the Godot AdMob SDK and configure user consent (UMP Flow) in GDScript and C.
poingstudios/godot-admob-plugin
Provides instructions to implement, load, show, and destroy interstitial ads (full-screen image/text ads) in GDScript and C.
poingstudios/godot-admob-plugin
Provides instructions to implement, load, show, and destroy Native Overlay ads (customized/native-looking Control node template overlays) in GDScript and C.
jame581/GodotPrompter
Covers Godot 4.3+ 2D systems with GDScript and C# examples: canvas layers, draw order, TileMaps, parallax, lights and shadows, particles and custom drawing.
jame581/GodotPrompter
Covers Godot 4.3+ 3D systems such as materials, lighting, shadows, environment, global illumination, fog, LOD, occlusion culling and decals, with GDScript first and C# second.
jame581/GodotPrompter
Builds a data-driven ability system in Godot 4 from Resources and a component node, with cooldowns, buffs, stat modifiers, gameplay tags and HUD binding.
jame581/GodotPrompter
Covers Godot 4.3+ editor plugins: plugin folders, @tool scripts, the EditorPlugin lifecycle, custom inspectors, dock panels and gizmos, in GDScript and C#.
jame581/GodotPrompter
Covers pathfinding and enemy movement in Godot 4.3 and later: navigation regions, NavigationAgent nodes, steering, behavior trees and patrol routes.
jame581/GodotPrompter
Covers animation in Godot 4.3 and later: AnimationPlayer basics, AnimationTree blend trees and state machines, sprite animation, skeleton IK and code-driven motion.
Categories
A skill your agent uses when running work off the main thread — WorkerThreadPool, Thread/Mutex/Semaphore, calldeferred, thread-safe scene access, and threaded resource loading. Multithreading is an agent skill from jame581/GodotPrompter.
Multithreading fits situations like: running work off the main thread — WorkerThreadPool; thread/Mutex/Semaphore; thread-safe scene access; threaded resource loading.
Run `npx skills add jame581/GodotPrompter --skill multithreading -a claude-code`. Or copy the skill folder (skills/multithreading in jame581/GodotPrompter) into .claude/skills/multithreading in your project. Claude Code loads it when a task matches its description.
Run `npx skills add jame581/GodotPrompter --skill multithreading -a codex`. Or copy the skill folder (skills/multithreading in jame581/GodotPrompter) into .agents/skills/multithreading in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add jame581/GodotPrompter --skill multithreading -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/multithreading, .gemini/skills/multithreading, .github/skills/multithreading and .opencode/skills/multithreading in your project.
SKILL.md names no scripts, command-line tools or credentials: Multithreading is instructions for the agent only.
SKILL.md names 1 domain. As links in the text: github.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Multithreading is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.7k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Multithreading: Release Manager (poingstudios/godot-admob-plugin, 631 stars), Godot Admob App Open (poingstudios/godot-admob-plugin, 631 stars), Godot Admob Banner (poingstudios/godot-admob-plugin, 631 stars) and Godot Admob Get Started (poingstudios/godot-admob-plugin, 631 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
jame581 (a GitHub user) maintains it in jame581/GodotPrompter, which has 792 GitHub stars. The repository holds 58 skills in this directory. The repository was last updated on October 6, 2026.
Source: jame581/GodotPrompter on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.