built-in predicate

# `threaded_call/1-2`

## Description

    threaded_call(Goal)
    threaded_call(Goal, Tag)

Proves `Goal` asynchronously using a new thread. The argument can be a message-sending goal. Calls to this predicate always succeed and return immediately. The results (success, failure, or exception) are sent back to the message queue of the object containing the call (this) and can be retrieved by calling the threaded_exit/1 predicate.

The `threaded_call/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_call(0)
    threaded_call(0, *)

## Modes and number of proofs

    threaded_call(@callable) - one
    threaded_call(@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_call(Goal)`
Prove `::Message` asynchronously in a new thread:
`threaded_call(::Message)`
Prove `Object::Message` asynchronously in a new thread:
`threaded_call(Object::Message)`

See also

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