built-in predicate

# `threaded_exit/1-2`

## Description

    threaded_exit(Goal)
    threaded_exit(Goal, Tag)

Retrieves the result of proving `Goal` in a new thread. This predicate blocks execution until the reply is sent to the this message queue by the thread executing the goal. When there is no thread proving the goal, the predicate generates an exception. This predicate is non-deterministic, providing access to any alternative solutions of its argument.

The argument of this predicate should be a variant of the argument of the corresponding threaded_call/1 or threaded_once/1 call. When the predicate argument is subsumed by the `threaded_call/1` or `threaded_once/1` call argument, the `threaded_exit/1` call will succeed iff its argument is a solution of the (more general) goal.

The `threaded_exit/2` variant accepts a threaded call identifier tag generated by the calls to the threaded_call/2 and threaded_once/2 predicates. Tags shall be regarded as an opaque term; 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.

## Modes and number of proofs

    threaded_exit(+callable) - zero_or_more
    threaded_exit(+callable, +nonvar) - zero_or_more

## Errors

`Goal` is a variable:
`instantiation_error`
`Goal` is neither a variable nor a callable term:
`type_error(callable, Goal)`
No thread is running for proving `Goal` in the `Object` calling context:
`existence_error(thread, Object)`
`Tag` is a variable:
`instantiation_error`

## Examples

To retrieve an asynchronous goal proof result:
`threaded_exit(Goal)`
To retrieve an asynchronous message to self result:
`threaded_exit(::Goal)`
To retrieve an asynchronous message result:
`threaded_exit(Object::Goal)`

See also

threaded_call/1-2, threaded_ignore/1, threaded_once/1-2, threaded_peek/1-2, threaded_cancel/1, threaded/1