10b57cec5SDimitry Andric// -*- C++ -*- 2349cc55cSDimitry Andric//===----------------------------------------------------------------------===// 30b57cec5SDimitry Andric// 40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 70b57cec5SDimitry Andric// 80b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 90b57cec5SDimitry Andric 100b57cec5SDimitry Andric#ifndef _LIBCPP_THREAD 110b57cec5SDimitry Andric#define _LIBCPP_THREAD 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric/* 140b57cec5SDimitry Andric 150b57cec5SDimitry Andric thread synopsis 160b57cec5SDimitry Andric 170b57cec5SDimitry Andricnamespace std 180b57cec5SDimitry Andric{ 190b57cec5SDimitry Andric 200b57cec5SDimitry Andricclass thread 210b57cec5SDimitry Andric{ 220b57cec5SDimitry Andricpublic: 230b57cec5SDimitry Andric class id; 240b57cec5SDimitry Andric typedef pthread_t native_handle_type; 250b57cec5SDimitry Andric 260b57cec5SDimitry Andric thread() noexcept; 270b57cec5SDimitry Andric template <class F, class ...Args> explicit thread(F&& f, Args&&... args); 280b57cec5SDimitry Andric ~thread(); 290b57cec5SDimitry Andric 300b57cec5SDimitry Andric thread(const thread&) = delete; 310b57cec5SDimitry Andric thread(thread&& t) noexcept; 320b57cec5SDimitry Andric 330b57cec5SDimitry Andric thread& operator=(const thread&) = delete; 340b57cec5SDimitry Andric thread& operator=(thread&& t) noexcept; 350b57cec5SDimitry Andric 360b57cec5SDimitry Andric void swap(thread& t) noexcept; 370b57cec5SDimitry Andric 380b57cec5SDimitry Andric bool joinable() const noexcept; 390b57cec5SDimitry Andric void join(); 400b57cec5SDimitry Andric void detach(); 410b57cec5SDimitry Andric id get_id() const noexcept; 420b57cec5SDimitry Andric native_handle_type native_handle(); 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric static unsigned hardware_concurrency() noexcept; 450b57cec5SDimitry Andric}; 460b57cec5SDimitry Andric 470b57cec5SDimitry Andricvoid swap(thread& x, thread& y) noexcept; 480b57cec5SDimitry Andric 490b57cec5SDimitry Andricclass thread::id 500b57cec5SDimitry Andric{ 510b57cec5SDimitry Andricpublic: 520b57cec5SDimitry Andric id() noexcept; 530b57cec5SDimitry Andric}; 540b57cec5SDimitry Andric 550b57cec5SDimitry Andricbool operator==(thread::id x, thread::id y) noexcept; 56bdd1243dSDimitry Andricbool operator!=(thread::id x, thread::id y) noexcept; // removed in C++20 57bdd1243dSDimitry Andricbool operator< (thread::id x, thread::id y) noexcept; // removed in C++20 58bdd1243dSDimitry Andricbool operator<=(thread::id x, thread::id y) noexcept; // removed in C++20 59bdd1243dSDimitry Andricbool operator> (thread::id x, thread::id y) noexcept; // removed in C++20 60bdd1243dSDimitry Andricbool operator>=(thread::id x, thread::id y) noexcept; // removed in C++20 61bdd1243dSDimitry Andricstrong_ordering operator<=>(thread::id x, thread::id y) noexcept; // C++20 620b57cec5SDimitry Andric 630b57cec5SDimitry Andrictemplate<class charT, class traits> 640b57cec5SDimitry Andricbasic_ostream<charT, traits>& 650b57cec5SDimitry Andricoperator<<(basic_ostream<charT, traits>& out, thread::id id); 660b57cec5SDimitry Andric 6706c3fb27SDimitry Andrictemplate<class charT> 6806c3fb27SDimitry Andricstruct formatter<thread::id, charT>; 6906c3fb27SDimitry Andric 700b57cec5SDimitry Andricnamespace this_thread 710b57cec5SDimitry Andric{ 720b57cec5SDimitry Andric 730b57cec5SDimitry Andricthread::id get_id() noexcept; 740b57cec5SDimitry Andric 750b57cec5SDimitry Andricvoid yield() noexcept; 760b57cec5SDimitry Andric 770b57cec5SDimitry Andrictemplate <class Clock, class Duration> 780b57cec5SDimitry Andricvoid sleep_until(const chrono::time_point<Clock, Duration>& abs_time); 790b57cec5SDimitry Andric 800b57cec5SDimitry Andrictemplate <class Rep, class Period> 810b57cec5SDimitry Andricvoid sleep_for(const chrono::duration<Rep, Period>& rel_time); 820b57cec5SDimitry Andric 830b57cec5SDimitry Andric} // this_thread 840b57cec5SDimitry Andric 850b57cec5SDimitry Andric} // std 860b57cec5SDimitry Andric 870b57cec5SDimitry Andric*/ 880b57cec5SDimitry Andric 897a6dacacSDimitry Andric#include <__config> 907a6dacacSDimitry Andric 91*0fca6ea1SDimitry Andric#if !defined(_LIBCPP_HAS_NO_THREADS) 927a6dacacSDimitry Andric 9306c3fb27SDimitry Andric# include <__thread/formatter.h> 945f757f3fSDimitry Andric# include <__thread/jthread.h> 95*0fca6ea1SDimitry Andric# include <__thread/support.h> 9606c3fb27SDimitry Andric# include <__thread/this_thread.h> 9706c3fb27SDimitry Andric# include <__thread/thread.h> 9804eeddc0SDimitry Andric# include <version> 990b57cec5SDimitry Andric 10081ad6265SDimitry Andric// standard-mandated includes 101bdd1243dSDimitry Andric 102bdd1243dSDimitry Andric// [thread.syn] 10381ad6265SDimitry Andric# include <compare> 10481ad6265SDimitry Andric 1050b57cec5SDimitry Andric# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1060b57cec5SDimitry Andric# pragma GCC system_header 1070b57cec5SDimitry Andric# endif 1080b57cec5SDimitry Andric 109*0fca6ea1SDimitry Andric#endif // !defined(_LIBCPP_HAS_NO_THREADS) 110*0fca6ea1SDimitry Andric 11106c3fb27SDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) 11206c3fb27SDimitry Andric# include <cstddef> 11306c3fb27SDimitry Andric# include <ctime> 11406c3fb27SDimitry Andric# include <iosfwd> 11506c3fb27SDimitry Andric# include <ratio> 1160b57cec5SDimitry Andric#endif 1170b57cec5SDimitry Andric 118bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17 119bdd1243dSDimitry Andric# include <chrono> 120bdd1243dSDimitry Andric#endif 121bdd1243dSDimitry Andric 122bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 12306c3fb27SDimitry Andric# include <cstring> 124bdd1243dSDimitry Andric# include <functional> 12506c3fb27SDimitry Andric# include <new> 12606c3fb27SDimitry Andric# include <system_error> 12706c3fb27SDimitry Andric# include <type_traits> 128bdd1243dSDimitry Andric#endif 129bdd1243dSDimitry Andric 1300b57cec5SDimitry Andric#endif // _LIBCPP_THREAD 131