built-in predicate

# `threaded_once/1-2`

## Description

    threaded_once(Goal)
    threaded_once(Goal, Tag)

Proves `Goal` asynchronously using a new thread. Only the first goal solution is found. The argument can be a message-sending goal. This call always succeeds. The result (success, failure, or exception) is sent back to the message queue of the object containing the call (this).

The `threaded_once/2` variant returns a threaded call identifier tag that can be used with the threaded_exit/2 and threaded_cancel/1 predicates. Tags shall be regarded as opaque terms; users shall not rely on their type.

Note

This predicate requires a backend Prolog compiler providing compatible multi-threading primitives. The value of the read-only threads flag is set to `supported` when that is the case.

## Meta-predicate template

    threaded_once(0)
    threaded_once(0, *)

## Modes and number of proofs

    threaded_once(@callable) - one
    threaded_once(@callable, --nonvar) - one

## Errors

Goal is a variable:
`instantiation_error`
Goal is neither a variable nor a callable term:
`type_error(callable, Goal)`
Tag is not a variable:
`uninstantiation_error(Tag)`

## Examples

Prove `Goal` asynchronously in a new thread:
`threaded_once(Goal)`
Prove `::Message` asynchronously in a new thread:
`threaded_once(::Message)`
Prove `Object::Message` asynchronously in a new thread:
`threaded_once(Object::Message)`

See also

threaded_call/1-2, threaded_exit/1-2, threaded_ignore/1, threaded_peek/1-2, threaded_cancel/1, threaded/1, synchronized/1