.. highlight:: c

.. _threads:

Thread states and the global interpreter lock
=============================================

.. index::
   single: global interpreter lock
   single: interpreter lock
   single: lock, interpreter

Unless on a :term:`free-threaded build` of :term:`CPython`,
the Python interpreter is generally not thread-safe.  In order to support
multi-threaded Python programs, there's a global lock, called the :term:`global
interpreter lock` or :term:`GIL`, that must be held by a thread before
accessing Python objects. Without the lock, even the simplest operations
could cause problems in a multi-threaded program: for example, when
two threads simultaneously increment the reference count of the same object, the
reference count could end up being incremented only once instead of twice.

As such, only a thread that holds the GIL may operate on Python objects or
invoke Python's C API.

.. index:: single: setswitchinterval (in module sys)

In order to emulate concurrency, the interpreter regularly tries to switch
threads between bytecode instructions (see :func:`sys.setswitchinterval`).
This is why locks are also necessary for thread-safety in pure-Python code.

Additionally, the global interpreter lock is released around blocking I/O
operations, such as reading or writing to a file. From the C API, this is done
by :ref:`detaching the thread state <detaching-thread-state>`.


.. index::
   single: PyThreadState (C type)

The Python interpreter keeps some thread-local information inside
a data structure called :c:type:`PyThreadState`, known as a :term:`thread state`.
Each thread has a thread-local pointer to a :c:type:`PyThreadState`; a thread state
referenced by this pointer is considered to be :term:`attached <attached thread state>`.

A thread can only have one :term:`attached thread state` at a time. An attached
thread state is typically analogous with holding the GIL, except on
free-threaded builds.  On builds with the GIL enabled, attaching a thread state
will block until the GIL can be acquired. However, even on builds with the GIL
disabled, it is still required to have an attached thread state, as the interpreter
needs to keep track of which threads may access Python objects.

.. note::

   Even on the free-threaded build, attaching a thread state may block, as the
   GIL can be re-enabled or threads might be temporarily suspended (such as during
   a garbage collection).

Generally, there will always be an attached thread state when using Python's
C API, including during embedding and when implementing methods, so it's uncommon
to need to set up a thread state on your own. Only in some specific cases, such
as in a :c:macro:`Py_BEGIN_ALLOW_THREADS` block or in a fresh thread, will the
thread not have an attached thread state.
If uncertain, check if :c:func:`PyThreadState_GetUnchecked` returns ``NULL``.

If it turns out that you do need to create a thread state, it is recommended to
use :c:func:`PyThreadState_Ensure` or :c:func:`PyThreadState_EnsureFromView`,
which will manage the thread state for you.


.. _detaching-thread-state:

Detaching the thread state from extension code
----------------------------------------------

Most extension code manipulating the :term:`thread state` has the following simple
structure::

   Save the thread state in a local variable.
   ... Do some blocking I/O operation ...
   Restore the thread state from the local variable.

This is so common that a pair of macros exists to simplify it::

   Py_BEGIN_ALLOW_THREADS
   ... Do some blocking I/O operation ...
   Py_END_ALLOW_THREADS

.. index::
   single: Py_BEGIN_ALLOW_THREADS (C macro)
   single: Py_END_ALLOW_THREADS (C macro)

The :c:macro:`Py_BEGIN_ALLOW_THREADS` macro opens a new block and declares a
hidden local variable; the :c:macro:`Py_END_ALLOW_THREADS` macro closes the
block.

The block above expands to the following code::

   PyThreadState *_save;

   _save = PyEval_SaveThread();
   ... Do some blocking I/O operation ...
   PyEval_RestoreThread(_save);

.. index::
   single: PyEval_RestoreThread (C function)
   single: PyEval_SaveThread (C function)

Here is how these functions work:

The attached thread state implies that the GIL is held for the interpreter.
To detach it, :c:func:`PyEval_SaveThread` is called and the result is stored
in a local variable.

By detaching the thread state, the GIL is released, which allows other threads
to attach to the interpreter and execute while the current thread performs
blocking I/O. When the I/O operation is complete, the old thread state is
reattached by calling :c:func:`PyEval_RestoreThread`, which will wait until
the GIL can be acquired.

.. note::
   Performing blocking I/O is the most common use case for detaching
   the thread state, but it is also useful to call it over long-running
   native code that doesn't need access to Python objects or Python's C API.
   For example, the standard :mod:`zlib` and :mod:`hashlib` modules detach the
   :term:`thread state <attached thread state>` when compressing or hashing
   data.

On a :term:`free-threaded build`, the :term:`GIL` is usually out of the question,
but **detaching the thread state is still required**, because the interpreter
periodically needs to block all threads to get a consistent view of Python objects
without the risk of race conditions.
For example, CPython currently suspends all threads for a short period of time
while running the garbage collector.

.. warning::

   Detaching the thread state can lead to unexpected behavior during interpreter
   finalization. See :ref:`cautions-regarding-runtime-finalization` for more
   details.


APIs
^^^^

The following macros are normally used without a trailing semicolon; look for
example usage in the Python source distribution.

.. note::

    These macros are still necessary on the :term:`free-threaded build` to prevent
    deadlocks.

.. c:macro:: Py_BEGIN_ALLOW_THREADS

   This macro expands to ``{ PyThreadState *_save; _save = PyEval_SaveThread();``.
   Note that it contains an opening brace; it must be matched with a following
   :c:macro:`Py_END_ALLOW_THREADS` macro.  See above for further discussion of this
   macro.


.. c:macro:: Py_END_ALLOW_THREADS

   This macro expands to ``PyEval_RestoreThread(_save); }``. Note that it contains
   a closing brace; it must be matched with an earlier
   :c:macro:`Py_BEGIN_ALLOW_THREADS` macro.  See above for further discussion of
   this macro.


.. c:macro:: Py_BLOCK_THREADS

   This macro expands to ``PyEval_RestoreThread(_save);``: it is equivalent to
   :c:macro:`Py_END_ALLOW_THREADS` without the closing brace.


.. c:macro:: Py_UNBLOCK_THREADS

   This macro expands to ``_save = PyEval_SaveThread();``: it is equivalent to
   :c:macro:`Py_BEGIN_ALLOW_THREADS` without the opening brace and variable
   declaration.


.. _non-python-created-threads:
.. _c-api-foreign-threads:


Using the C API from foreign threads
------------------------------------

When threads are created using the dedicated Python APIs (such as the
:mod:`threading` module), a thread state is automatically associated with them,
However, when a thread is created from native code (for example, by a
third-party library with its own thread management), it doesn't hold an
attached thread state.

If you need to call Python code from these threads (often this will be part
of a callback API provided by the aforementioned third-party library),
you must first register these threads with the interpreter by
creating a new thread state and attaching it.

The easiest way to do this is through :c:func:`PyThreadState_Ensure`
or :c:func:`PyThreadState_EnsureFromView`.

.. note::
   These functions require an argument pointing to the desired
   interpreter; such a pointer can be acquired via a call to
   :c:func:`PyInterpreterGuard_FromCurrent` (for ``PyThreadState_Ensure``) or
   :c:func:`PyInterpreterView_FromCurrent` (for ``PyThreadState_EnsureFromView``)
   from the function that creates the thread. If no pointer is available (such
   as when the given native thread library doesn't provide a data argument),
   :c:func:`PyInterpreterView_FromMain` can be used to get a view for the main
   interpreter, but note that this will make the code incompatible with
   subinterpreters.


For example::

   // The return value of PyInterpreterGuard_FromCurrent() from the
   // function that created this thread.
   PyInterpreterGuard *guard = thread_data->guard;

   // Create a new thread state for the interpreter.
   PyThreadStateToken *token = PyThreadState_Ensure(guard);
   if (token == NULL) {
      PyInterpreterGuard_Close(guard);
      return;
   }

   // We have a valid thread state -- perform Python actions here.
   result = CallSomeFunction();
   // Evaluate result or handle exceptions.

   // Release the thread state. No calls to the C API are allowed beyond this
   // point.
   PyThreadState_Release(token);
   PyInterpreterGuard_Close(guard);


Keep in mind that calling ``PyThreadState_Ensure`` might not always create a new
thread state, and calling ``PyThreadState_Release`` might not always detach it.
These functions may reuse an existing attached thread state, or may re-attach
a thread state that was previously attached for the current thread.

.. seealso::
   :pep:`788`

.. _c-api-reuse-thread-state:

Reusing a thread state across repeated calls
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Creating and destroying a :c:type:`PyThreadState` is not free, and is more
expensive on a :term:`free-threaded build`.  A foreign thread that calls into
the interpreter many times -- for example, a worker thread in a native thread
pool -- should avoid creating a fresh thread state on every entry and
destroying it on every exit.  Instead, set up one thread state when the thread
starts (or lazily on its first call into Python), attach and detach it around
each call, and tear it down once when the thread exits.

Manage the thread state explicitly with :c:func:`PyThreadState_New`, attaching
and detaching it with :c:func:`PyEval_RestoreThread` and
:c:func:`PyEval_SaveThread`.  This happens in three distinct phases, at
different points in the thread's life.

When the thread starts, create one thread state for it.  ``interp`` is the
target interpreter, captured by the code that created this thread while it held
an attached thread state (for example via :c:func:`PyInterpreterState_Get`)::

   PyThreadState *tstate = PyThreadState_New(interp);

Then, on each call into Python -- which may happen many times over the thread's
life -- attach the thread state, make the Python C API calls that require it,
and detach again so the thread does not hold the GIL while off doing non-Python
work::

   PyEval_RestoreThread(tstate);
   result = CallSomeFunction();  /* your Python C API calls go here */
   PyEval_SaveThread();

When the thread is finished calling into Python, destroy the thread state once::

   PyEval_RestoreThread(tstate);
   PyThreadState_Clear(tstate);
   PyThreadState_DeleteCurrent();

The general-purpose entry points for calling in from a foreign thread --
:c:func:`PyThreadState_Ensure` and the older :c:func:`PyGILState_Ensure` -- do
*not* guarantee a persistent thread state: their thread-state lifetime is
deliberately implementation-defined, so a matched acquire/release pair may
create and destroy a thread state each time.  Use :c:func:`PyThreadState_New`,
as shown here, whenever you specifically want to reuse one thread state across
calls.

The code that created the foreign thread must arrange for the shutdown sequence
to run before the thread exits, and before :c:func:`Py_FinalizeEx` is called.
If interpreter finalization begins first, the shutdown
:c:func:`PyEval_RestoreThread` call will hang the thread rather than return (see
:ref:`cautions-regarding-runtime-finalization`).  If the thread exits without
running the shutdown sequence, the thread state is leaked for the remainder of
the process.

.. _c-api-attach-detach:

Attaching/detaching thread states
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. c:function:: PyThreadStateToken *PyThreadState_Ensure(PyInterpreterGuard *guard)

   Ensure that the thread has an attached thread state for the
   interpreter protected by *guard*, and thus can safely invoke that
   interpreter.

   It is OK to call this function if the thread already has an
   attached thread state, as long as there is a subsequent call to
   :c:func:`PyThreadState_Release` that matches this one (meaning that "nested"
   calls to this function are permitted).

   The function's effect (if any) will be reversed by the matching call to
   :c:func:`PyThreadState_Release`.

   On error, this function returns ``NULL`` *without* an exception set.
   Do not call :c:func:`!PyThreadState_Release` in this case.

   On success, this function returns a pointer value that must be passed
   to the matching call to :c:func:`!PyThreadState_Release`.

   The conditions in which this function creates a new :term:`thread state` are
   considered unstable and implementation-dependent. If you need to control the
   exact lifetime of a thread state, consider using :c:func:`PyThreadState_New`.
   However, do not avoid this function solely on the basis that the lifetime
   of the thread state may be inconsistent across versions; changes to this
   function will be done with caution and in a backwards-compatible manner.
   In particular, the saving of thread-local variables and similar state will
   be retained across Python versions.

   .. impl-detail::

      The exact behavior of whether this function creates a new thread state is
      described below, but be aware that this may change in the future.

      First, this function checks if an attached thread state is present.
      If there is, this function then checks if the interpreter of that
      thread state matches the interpreter guarded by *guard*. If that is
      the case, this function simply marks the thread state as being used
      by a ``PyThreadState_Ensure`` call and returns.

      If there is no attached thread state, then this function checks if any
      thread state has been used by the current OS thread. (This is
      returned by :c:func:`PyGILState_GetThisThreadState`.)
      If there was, then this function checks if that thread state's interpreter
      matches *guard*. If it does, it is re-attached and marked as used.

      Otherwise, if both of the above cases fail, a new thread state is created
      for *guard*. It is then attached and marked as owned by ``PyThreadState_Ensure``.

   .. versionadded:: 3.15


.. c:function:: PyThreadStateToken *PyThreadState_EnsureFromView(PyInterpreterView *view)

   Get an attached thread state for the interpreter referenced by *view*.

   The behavior and return value are the same as for :c:func:`PyThreadState_Ensure`;
   additionally, if the function succeeds, the interpreter referenced by *view* will
   be implicitly guarded. The guard will be released upon the corresponding
   :c:func:`PyThreadState_Release` call.

   .. versionadded:: 3.15


.. c:function:: void PyThreadState_Release(PyThreadStateToken *token)

   Undo a :c:func:`PyThreadState_Ensure` or
   :c:func:`PyThreadState_EnsureFromView` call.

   This must be called exactly once for each successful *Ensure* call, with
   *token* set to that call's return value.

   The state that was attached before the corresponding *Ensure* call
   (if any) will be attached when :c:func:`PyThreadState_Release` returns.

   The exact behavior of whether this function deletes a thread state is
   considered unstable and implementation-dependent.

   .. impl-detail::

      Currently, this function will decrement an internal counter on the
      attached thread state. If this counter ever reaches below zero, this
      function emits a fatal error (via :c:func:`Py_FatalError`).

      If the attached thread state is owned by ``PyThreadState_Ensure``, then the
      attached thread state will be deallocated and deleted upon the internal counter
      reaching zero. Otherwise, nothing happens when the counter reaches zero.

   .. versionadded:: 3.15

.. c:type:: PyThreadStateToken

   An opaque token retrieved from a :c:func:`PyThreadState_Ensure` call
   and passed to a corresponding :c:func:`PyThreadState_Release` call.


.. _legacy-api:
.. _gilstate:

GIL-state APIs
--------------

The following APIs are generally not compatible with subinterpreters and
will hang the process during interpreter finalization (see
:ref:`cautions-regarding-runtime-finalization`). As such, these APIs were
:term:`soft deprecated` in Python 3.15 in favor of the :ref:`new APIs
<c-api-foreign-threads>`.


.. c:type:: PyGILState_STATE

   The type of the value returned by :c:func:`PyGILState_Ensure` and passed to
   :c:func:`PyGILState_Release`.

   .. c:enumerator:: PyGILState_LOCKED

      The GIL was already held when :c:func:`PyGILState_Ensure` was called.

   .. c:enumerator:: PyGILState_UNLOCKED

      The GIL was not held when :c:func:`PyGILState_Ensure` was called.


.. c:function:: PyGILState_STATE PyGILState_Ensure()

   Ensure that the current thread is ready to call the Python C API regardless
   of the current state of Python, or of the :term:`attached thread state`. This may
   be called as many times as desired by a thread as long as each call is
   matched with a call to :c:func:`PyGILState_Release`. In general, other
   thread-related APIs may be used between :c:func:`PyGILState_Ensure` and
   :c:func:`PyGILState_Release` calls as long as the thread state is restored to
   its previous state before the Release().  For example, normal usage of the
   :c:macro:`Py_BEGIN_ALLOW_THREADS` and :c:macro:`Py_END_ALLOW_THREADS` macros is
   acceptable.

   The return value is an opaque "handle" to the :term:`attached thread state` when
   :c:func:`PyGILState_Ensure` was called, and must be passed to
   :c:func:`PyGILState_Release` to ensure Python is left in the same state. Even
   though recursive calls are allowed, these handles *cannot* be shared - each
   unique call to :c:func:`PyGILState_Ensure` must save the handle for its call
   to :c:func:`PyGILState_Release`.

   When the function returns, there will be an :term:`attached thread state`
   and the thread will be able to call arbitrary Python code.

   This function has no way to return an error. As such, errors are either fatal
   (that is, they send ``SIGABRT`` and crash the process; see
   :c:func:`Py_FatalError`), or the thread will be permanently blocked (such as
   during interpreter finalization).

   .. warning::
      Calling this function when the interpreter is finalizing will
      infinitely hang the thread, which may cause deadlocks.
      :ref:`cautions-regarding-runtime-finalization` for more details.

      In addition, this function generally does not work with subinterpreters
      when used from foreign threads, because this function has no way of
      knowing which interpreter created the thread (and as such, will implicitly
      pick the main interpreter).

   .. versionchanged:: 3.14
      Hangs the current thread, rather than terminating it, if called while the
      interpreter is finalizing.

   .. soft-deprecated:: 3.15
      Use :c:func:`PyThreadState_Ensure` or
      :c:func:`PyThreadState_EnsureFromView` instead.


.. c:function:: void PyGILState_Release(PyGILState_STATE)

   Release any resources previously acquired.  After this call, Python's state will
   be the same as it was prior to the corresponding :c:func:`PyGILState_Ensure` call
   (but generally this state will be unknown to the caller, hence the use of the
   GIL-state API).

   Every call to :c:func:`PyGILState_Ensure` must be matched by a call to
   :c:func:`PyGILState_Release` on the same thread.

   .. soft-deprecated:: 3.15
      Use :c:func:`PyThreadState_Release` instead.


.. c:function:: PyThreadState* PyGILState_GetThisThreadState()

   Get the :term:`thread state` that was most recently :term:`attached
   <attached thread state>` for this thread. (If the most recent thread state
   has been deleted, this returns ``NULL``.)

   If the caller has an attached thread state, it is returned.

   In other terms, this function returns the thread state that will be used by
   :c:func:`PyGILState_Ensure`. If this returns ``NULL``, then
   ``PyGILState_Ensure`` will create a new thread state.

   This function cannot fail.

   .. soft-deprecated:: 3.15
      Use :c:func:`PyThreadState_Get` or :c:func:`PyThreadState_GetUnchecked`
      instead.


.. c:function:: int PyGILState_Check()

   Return ``1`` if the current thread has an :term:`attached thread state`
   that matches the thread state returned by
   :c:func:`PyGILState_GetThisThreadState`. If the caller has no attached thread
   state or it otherwise doesn't match, then this returns ``0``.

   If the current Python process has ever created a subinterpreter, this
   function will *always* return ``1``.

   This is mainly a helper/diagnostic function.

   .. versionadded:: 3.4

   .. soft-deprecated:: 3.15
      Use ``PyThreadState_GetUnchecked() != NULL`` instead.


.. _fork-and-threads:

Cautions about fork()
---------------------

Another important thing to note about threads is their behaviour in the face
of the C :c:func:`fork` call. On most systems with :c:func:`fork`, after a
process forks only the thread that issued the fork will exist.  This has a
concrete impact both on how locks must be handled and on all stored state
in CPython's runtime.

The fact that only the "current" thread remains
means any locks held by other threads will never be released. Python solves
this for :func:`os.fork` by acquiring the locks it uses internally before
the fork, and releasing them afterwards. In addition, it resets any
:ref:`lock-objects` in the child. When extending or embedding Python, there
is no way to inform Python of additional (non-Python) locks that need to be
acquired before or reset after a fork. OS facilities such as
:c:func:`!pthread_atfork` would need to be used to accomplish the same thing.
Additionally, when extending or embedding Python, calling :c:func:`fork`
directly rather than through :func:`os.fork` (and returning to or calling
into Python) may result in a deadlock by one of Python's internal locks
being held by a thread that is defunct after the fork.
:c:func:`PyOS_AfterFork_Child` tries to reset the necessary locks, but is not
always able to.

The fact that all other threads go away also means that CPython's
runtime state there must be cleaned up properly, which :func:`os.fork`
does.  This means finalizing all other :c:type:`PyThreadState` objects
belonging to the current interpreter and all other
:c:type:`PyInterpreterState` objects.  Due to this and the special
nature of the :ref:`"main" interpreter <sub-interpreter-support>`,
:c:func:`fork` should only be called in that interpreter's "main"
thread, where the CPython global runtime was originally initialized.
The only exception is if :c:func:`exec` will be called immediately
after.


High-level APIs
---------------

These are the most commonly used types and functions when writing multi-threaded
C extensions.


.. c:type:: PyThreadState

   This data structure represents the state of a single thread.  The only public
   data member is:

   .. c:member:: PyInterpreterState *interp

      This thread's interpreter state.


.. c:function:: void PyEval_InitThreads()

   .. index::
      single: PyEval_AcquireThread()
      single: PyEval_ReleaseThread()
      single: PyEval_SaveThread()
      single: PyEval_RestoreThread()

   Deprecated function which does nothing.

   In Python 3.6 and older, this function created the GIL if it didn't exist.

   .. versionchanged:: 3.9
      The function now does nothing.

   .. versionchanged:: 3.7
      This function is now called by :c:func:`Py_Initialize()`, so you don't
      have to call it yourself anymore.

   .. versionchanged:: 3.2
      This function cannot be called before :c:func:`Py_Initialize()` anymore.

   .. deprecated:: 3.9

   .. index:: pair: module; _thread


.. c:function:: PyThreadState* PyEval_SaveThread()

   Detach the :term:`attached thread state` and return it.
   The thread will have no :term:`thread state` upon returning.


.. c:function:: void PyEval_RestoreThread(PyThreadState *tstate)

   Set the :term:`attached thread state` to *tstate*.
   The passed :term:`thread state` **should not** be :term:`attached <attached thread state>`,
   otherwise deadlock ensues. *tstate* will be attached upon returning.

   .. note::
      Calling this function from a thread when the runtime is finalizing will
      hang the thread until the program exits, even if the thread was not
      created by Python.  Refer to
      :ref:`cautions-regarding-runtime-finalization` for more details.

   .. versionchanged:: 3.14
      Hangs the current thread, rather than terminating it, if called while the
      interpreter is finalizing.

.. c:function:: PyThreadState* PyThreadState_Get()

   Return the :term:`attached thread state`. If the thread has no attached
   thread state, (such as when inside of :c:macro:`Py_BEGIN_ALLOW_THREADS`
   block), then this issues a fatal error (so that the caller needn't check
   for ``NULL``).

   See also :c:func:`PyThreadState_GetUnchecked`.

.. c:function:: PyThreadState* PyThreadState_GetUnchecked()

   Similar to :c:func:`PyThreadState_Get`, but don't kill the process with a
   fatal error if it is NULL. The caller is responsible to check if the result
   is NULL.

   .. versionadded:: 3.13
      In Python 3.5 to 3.12, the function was private and known as
      ``_PyThreadState_UncheckedGet()``.


.. c:function:: PyThreadState* PyThreadState_Swap(PyThreadState *tstate)

   Set the :term:`attached thread state` to *tstate*, and return the
   :term:`thread state` that was attached prior to calling.

   This function is safe to call without an :term:`attached thread state`; it
   will simply return ``NULL`` indicating that there was no prior thread state.

   .. seealso::
      :c:func:`PyEval_ReleaseThread`

   .. note::
      Similar to :c:func:`PyGILState_Ensure`, this function will hang the
      thread if the runtime is finalizing.


Low-level APIs
--------------

.. c:function:: PyThreadState* PyThreadState_New(PyInterpreterState *interp)

   Create a new thread state object belonging to the given interpreter object.
   An :term:`attached thread state` is not needed.

.. c:function:: void PyThreadState_Clear(PyThreadState *tstate)

   Reset all information in a :term:`thread state` object.  *tstate*
   must be :term:`attached <attached thread state>`

   .. versionchanged:: 3.9
      This function now calls the :c:member:`!PyThreadState.on_delete` callback.
      Previously, that happened in :c:func:`PyThreadState_Delete`.

   .. versionchanged:: 3.13
      The :c:member:`!PyThreadState.on_delete` callback was removed.


.. c:function:: void PyThreadState_Delete(PyThreadState *tstate)

   Destroy a :term:`thread state` object.  *tstate* should not
   be :term:`attached <attached thread state>` to any thread.
   *tstate* must have been reset with a previous call to
   :c:func:`PyThreadState_Clear`.


.. c:function:: void PyThreadState_DeleteCurrent(void)

   Detach the :term:`attached thread state` (which must have been reset
   with a previous call to :c:func:`PyThreadState_Clear`) and then destroy it.

   No :term:`thread state` will be :term:`attached <attached thread state>` upon
   returning.

.. c:function:: PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate)

   Get the current frame of the Python thread state *tstate*.

   Return a :term:`strong reference`. Return ``NULL`` if no frame is currently
   executing.

   See also :c:func:`PyEval_GetFrame`.

   *tstate* must not be ``NULL``, and must be :term:`attached <attached thread state>`.

   .. versionadded:: 3.9


.. c:function:: uint64_t PyThreadState_GetID(PyThreadState *tstate)

   Get the unique :term:`thread state` identifier of the Python thread state *tstate*.

   *tstate* must not be ``NULL``, and must be :term:`attached <attached thread state>`.

   .. versionadded:: 3.9


.. c:function:: PyInterpreterState* PyThreadState_GetInterpreter(PyThreadState *tstate)

   Get the interpreter of the Python thread state *tstate*.

   *tstate* must not be ``NULL``, and must be :term:`attached <attached thread state>`.

   .. versionadded:: 3.9


.. c:function:: void PyThreadState_EnterTracing(PyThreadState *tstate)

   Suspend tracing and profiling in the Python thread state *tstate*.

   Resume them using the :c:func:`PyThreadState_LeaveTracing` function.

   .. versionadded:: 3.11


.. c:function:: void PyThreadState_LeaveTracing(PyThreadState *tstate)

   Resume tracing and profiling in the Python thread state *tstate* suspended
   by the :c:func:`PyThreadState_EnterTracing` function.

   See also :c:func:`PyEval_SetTrace` and :c:func:`PyEval_SetProfile`
   functions.

   .. versionadded:: 3.11


.. c:function:: int PyUnstable_ThreadState_SetStackProtection(PyThreadState *tstate, void *stack_start_addr, size_t stack_size)

   Set the stack protection start address and stack protection size
   of a Python thread state.

   On success, return ``0``.
   On failure, set an exception and return ``-1``.

   CPython implements :ref:`recursion control <recursion>` for C code by raising
   :py:exc:`RecursionError` when it notices that the machine execution stack is close
   to overflow. See for example the :c:func:`Py_EnterRecursiveCall` function.
   For this, it needs to know the location of the current thread's stack, which it
   normally gets from the operating system.
   When the stack is changed, for example using context switching techniques like the
   Boost library's ``boost::context``, you must call
   :c:func:`~PyUnstable_ThreadState_SetStackProtection` to inform CPython of the change.

   Call :c:func:`~PyUnstable_ThreadState_SetStackProtection` either before
   or after changing the stack.
   Do not call any other Python C API between the call and the stack
   change.

   See :c:func:`PyUnstable_ThreadState_ResetStackProtection` for undoing this operation.

   .. versionadded:: 3.15


.. c:function:: void PyUnstable_ThreadState_ResetStackProtection(PyThreadState *tstate)

   Reset the stack protection start address and stack protection size
   of a Python thread state to the operating system defaults.

   See :c:func:`PyUnstable_ThreadState_SetStackProtection` for an explanation.

   .. versionadded:: 3.15


.. c:function:: PyObject* PyThreadState_GetDict()

   Return a dictionary in which extensions can store thread-specific state
   information.  Each extension should use a unique key to store a state in
   the dictionary.  It is okay to call this function when no :term:`thread state`
   is :term:`attached <attached thread state>`. If this function returns
   ``NULL`` and no exception has been raised, then the caller should assume no
   thread state is attached.


.. c:function:: void PyEval_AcquireThread(PyThreadState *tstate)

   :term:`Attach <attached thread state>` *tstate* to the current thread,
   which must not be ``NULL`` or already :term:`attached <attached thread state>`.

   The calling thread must not already have an :term:`attached thread state`.

   .. note::
      Calling this function from a thread when the runtime is finalizing will
      hang the thread until the program exits, even if the thread was not
      created by Python.  Refer to
      :ref:`cautions-regarding-runtime-finalization` for more details.

   .. versionchanged:: 3.8
      Updated to be consistent with :c:func:`PyEval_RestoreThread`,
      :c:func:`Py_END_ALLOW_THREADS`, and :c:func:`PyGILState_Ensure`,
      and terminate the current thread if called while the interpreter is finalizing.

   .. versionchanged:: 3.14
      Hangs the current thread, rather than terminating it, if called while the
      interpreter is finalizing.

   :c:func:`PyEval_RestoreThread` is a higher-level function which is always
   available (even when threads have not been initialized).


.. c:function:: void PyEval_ReleaseThread(PyThreadState *tstate)

   Detach the :term:`attached thread state`.
   The *tstate* argument, which must not be ``NULL``, is only used to check
   that it represents the :term:`attached thread state` --- if it isn't, a fatal error is
   reported.

   :c:func:`PyEval_SaveThread` is a higher-level function which is always
   available (even when threads have not been initialized).


Asynchronous notifications
==========================

A mechanism is provided to make asynchronous notifications to the main
interpreter thread.  These notifications take the form of a function
pointer and a void pointer argument.


.. c:function:: int Py_AddPendingCall(int (*func)(void *), void *arg)

   Schedule a function to be called from the main interpreter thread.  On
   success, ``0`` is returned and *func* is queued for being called in the
   main thread.  On failure, ``-1`` is returned without setting any exception.

   When successfully queued, *func* will be *eventually* called from the
   main interpreter thread with the argument *arg*.  It will be called
   asynchronously with respect to normally running Python code, but with
   both these conditions met:

   * on a :term:`bytecode` boundary;
   * with the main thread holding an :term:`attached thread state`
     (*func* can therefore use the full C API).

   *func* must return ``0`` on success, or ``-1`` on failure with an exception
   set.  *func* won't be interrupted to perform another asynchronous
   notification recursively, but it can still be interrupted to switch
   threads if the :term:`thread state <attached thread state>` is detached.

   This function doesn't need an :term:`attached thread state`. However, to call this
   function in a subinterpreter, the caller must have an :term:`attached thread state`.
   Otherwise, the function *func* can be scheduled to be called from the wrong interpreter.

   .. warning::
      This is a low-level function, only useful for very special cases.
      There is no guarantee that *func* will be called as quick as
      possible.  If the main thread is busy executing a system call,
      *func* won't be called before the system call returns.  This
      function is generally **not** suitable for calling Python code from
      arbitrary C threads.  Instead, use :c:func:`PyThreadState_EnsureFromView`.

   .. versionadded:: 3.1

   .. versionchanged:: 3.9
      If this function is called in a subinterpreter, the function *func* is
      now scheduled to be called from the subinterpreter, rather than being
      called from the main interpreter. Each subinterpreter now has its own
      list of scheduled calls.

   .. versionchanged:: 3.12
      This function now always schedules *func* to be run in the main
      interpreter.


.. c:function:: int Py_MakePendingCalls(void)

   Execute all pending calls. This is usually executed automatically by the
   interpreter.

   This function returns ``0`` on success, and returns ``-1`` with an exception
   set on failure.

   If this is not called in the main thread of the main
   interpreter, this function does nothing and returns ``0``.
   The caller must hold an :term:`attached thread state`.

   .. versionadded:: 3.1

   .. versionchanged:: 3.12
      This function only runs pending calls in the main interpreter.


.. c:function:: int PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc)

   Schedule an exception to be raised asynchronously in a thread.
   If the thread has a previously scheduled exception, it is overwritten.

   The *id* argument is the thread id of the target thread, as returned by
   :c:func:`PyThread_get_thread_ident`.
   *exc* is the class of the exception to be raised, or ``NULL`` to clear
   the pending exception (if any).

   Return the number of affected thread states.
   This is normally ``1`` if *id* is found, even when no change was
   made (the given *exc* was already pending, or *exc* is ``NULL`` but
   no exception is pending).
   If the thread id isn't found, return ``0``.  This raises no exceptions.

   To prevent naive misuse, you must write your own C extension to call this.
   This function must be called with an :term:`attached thread state`.
   This function does not :term:`steal` any references to *exc*.
   This function does not necessarily interrupt system calls such as
   :py:func:`~time.sleep`.

   .. versionchanged:: 3.7
      The type of the *id* parameter changed from :c:expr:`long` to
      :c:expr:`unsigned long`.


Operating system thread APIs
============================

.. c:macro:: PYTHREAD_INVALID_THREAD_ID

   Sentinel value for an invalid thread ID.

   This is currently equivalent to ``(unsigned long)-1``.


.. c:function:: unsigned long PyThread_start_new_thread(void (*func)(void *), void *arg)

   Start function *func* in a new thread with argument *arg*.
   The resulting thread is not intended to be joined.

   *func* must not be ``NULL``, but *arg* may be ``NULL``.

   On success, this function returns the identifier of the new thread; on failure,
   this returns :c:macro:`PYTHREAD_INVALID_THREAD_ID`.

   The caller does not need to hold an :term:`attached thread state`.


.. c:function:: unsigned long PyThread_get_thread_ident(void)

   Return the identifier of the current thread, which will never be zero.

   This function cannot fail, and the caller does not need to hold an
   :term:`attached thread state`.

   .. seealso::
      :py:func:`threading.get_ident` and :py:attr:`threading.Thread.ident`
      expose this identifier to Python.


.. c:function:: PyObject *PyThread_GetInfo(void)

   Get general information about the current thread in the form of a
   :ref:`struct sequence <struct-sequence-objects>` object. This information is
   accessible as :py:attr:`sys.thread_info` in Python.

   On success, this returns a new :term:`strong reference` to the thread
   information; on failure, this returns ``NULL`` with an exception set.

   The caller must hold an :term:`attached thread state`.


.. c:macro:: PY_HAVE_THREAD_NATIVE_ID

   This macro is defined when the system supports native thread IDs.


.. c:function:: unsigned long PyThread_get_thread_native_id(void)

   Get the native identifier of the current thread as it was assigned by the operating
   system's kernel, which will never be less than zero.

   This function is only available when :c:macro:`PY_HAVE_THREAD_NATIVE_ID` is
   defined.

   This function cannot fail, and the caller does not need to hold an
   :term:`attached thread state`.

   .. seealso::
      :py:func:`threading.get_native_id`


.. c:function:: void PyThread_exit_thread(void)

   Terminate the current thread. This function is generally considered unsafe
   and should be avoided. It is kept solely for backwards compatibility.

   This function is only safe to call if all functions in the full call
   stack are written to safely allow it.

   .. warning::

      If the current system uses POSIX threads (also known as "pthreads"),
      this calls :manpage:`pthread_exit(3)`, which attempts to unwind the stack
      and call C++ destructors on some libc implementations. However, if a
      ``noexcept`` function is reached, it may terminate the process.
      Other systems, such as macOS, do unwinding.

      On Windows, this function calls ``_endthreadex()``, which kills the thread
      without calling C++ destructors.

      In any case, there is a risk of corruption on the thread's stack.

   .. deprecated:: 3.14


.. c:function:: void PyThread_init_thread(void)

   Initialize ``PyThread*`` APIs. Python executes this function automatically,
   so there's little need to call it from an extension module.


.. c:function:: int PyThread_set_stacksize(size_t size)

   Set the stack size of the current thread to *size* bytes.

   This function returns ``0`` on success, ``-1`` if *size* is invalid, or
   ``-2`` if the system does not support changing the stack size. This function
   does not set exceptions.

   The caller does not need to hold an :term:`attached thread state`.


.. c:function:: size_t PyThread_get_stacksize(void)

   Return the stack size of the current thread in bytes, or ``0`` if the system's
   default stack size is in use.

   The caller does not need to hold an :term:`attached thread state`.
