1// -*- C++ -*- 2//===----------------------------------------------------------------------===// 3// 4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5// See https://llvm.org/LICENSE.txt for license information. 6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef _LIBCPP_THREAD 11#define _LIBCPP_THREAD 12 13/* 14 15 thread synopsis 16 17namespace std 18{ 19 20class thread 21{ 22public: 23 class id; 24 typedef pthread_t native_handle_type; 25 26 thread() noexcept; 27 template <class F, class ...Args> explicit thread(F&& f, Args&&... args); 28 ~thread(); 29 30 thread(const thread&) = delete; 31 thread(thread&& t) noexcept; 32 33 thread& operator=(const thread&) = delete; 34 thread& operator=(thread&& t) noexcept; 35 36 void swap(thread& t) noexcept; 37 38 bool joinable() const noexcept; 39 void join(); 40 void detach(); 41 id get_id() const noexcept; 42 native_handle_type native_handle(); 43 44 static unsigned hardware_concurrency() noexcept; 45}; 46 47void swap(thread& x, thread& y) noexcept; 48 49class thread::id 50{ 51public: 52 id() noexcept; 53}; 54 55bool operator==(thread::id x, thread::id y) noexcept; 56bool operator!=(thread::id x, thread::id y) noexcept; // removed in C++20 57bool operator< (thread::id x, thread::id y) noexcept; // removed in C++20 58bool operator<=(thread::id x, thread::id y) noexcept; // removed in C++20 59bool operator> (thread::id x, thread::id y) noexcept; // removed in C++20 60bool operator>=(thread::id x, thread::id y) noexcept; // removed in C++20 61strong_ordering operator<=>(thread::id x, thread::id y) noexcept; // C++20 62 63template<class charT, class traits> 64basic_ostream<charT, traits>& 65operator<<(basic_ostream<charT, traits>& out, thread::id id); 66 67template<class charT> 68struct formatter<thread::id, charT>; 69 70namespace this_thread 71{ 72 73thread::id get_id() noexcept; 74 75void yield() noexcept; 76 77template <class Clock, class Duration> 78void sleep_until(const chrono::time_point<Clock, Duration>& abs_time); 79 80template <class Rep, class Period> 81void sleep_for(const chrono::duration<Rep, Period>& rel_time); 82 83} // this_thread 84 85} // std 86 87*/ 88 89#include <__config> 90 91#ifdef _LIBCPP_HAS_NO_THREADS 92# error "<thread> is not supported since libc++ has been configured without support for threads." 93#endif 94 95#include <__assert> // all public C++ headers provide the assertion handler 96#include <__availability> 97#include <__thread/formatter.h> 98#include <__thread/jthread.h> 99#include <__thread/this_thread.h> 100#include <__thread/thread.h> 101#include <__threading_support> 102#include <version> 103 104// standard-mandated includes 105 106// [thread.syn] 107#include <compare> 108 109#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 110# pragma GCC system_header 111#endif 112 113#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) 114# include <cstddef> 115# include <ctime> 116# include <iosfwd> 117# include <ratio> 118#endif 119 120#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17 121# include <chrono> 122#endif 123 124#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 125# include <cstring> 126# include <functional> 127# include <new> 128# include <system_error> 129# include <type_traits> 130#endif 131 132#endif // _LIBCPP_THREAD 133