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 <__assert> // all public C++ headers provide the assertion handler 90#include <__availability> 91#include <__config> 92#include <__thread/formatter.h> 93#include <__thread/this_thread.h> 94#include <__thread/thread.h> 95#include <__threading_support> 96#include <version> 97 98// standard-mandated includes 99 100// [thread.syn] 101#include <compare> 102 103#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 104# pragma GCC system_header 105#endif 106 107#ifdef _LIBCPP_HAS_NO_THREADS 108# error "<thread> is not supported since libc++ has been configured without support for threads." 109#endif 110 111#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) 112# include <cstddef> 113# include <ctime> 114# include <iosfwd> 115# include <ratio> 116#endif 117 118#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17 119# include <chrono> 120#endif 121 122#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 123# include <cstring> 124# include <functional> 125# include <new> 126# include <system_error> 127# include <type_traits> 128#endif 129 130#endif // _LIBCPP_THREAD 131