// Copyright (c) 2018 GeometryFactory Sarl (France). // All rights reserved. // // This file is part of CGAL (www.cgal.org) // // $URL: https://github.com/CGAL/cgal/blob/v5.1/STL_Extension/include/CGAL/thread.h $ // $Id: thread.h 0779373 2020-03-26T13:31:46+01:00 Sébastien Loriot // SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial // // Author(s) : Simon Giraudot #ifndef CGAL_THREAD_H #define CGAL_THREAD_H #include /* This file defines the following: - CGAL::cpp11::thread - CGAL::cpp11::atomic - CGAL::cpp11::sleep_for It uses either TBB or STD depending on what's available: as TBB can quite often override `std::thread`, it is possible that TBB will be used instead of STD even if the real CXX11 `std::thread` is available. As the conflicting API between TBB and STD can be quite complicated, we offer a more generic `sleep_for()` function that takes double-typed seconds as argument and deals with it. */ #if defined(CGAL_LINKED_WITH_TBB) # include # if TBB_IMPLEMENT_CPP0X # include # include # include # define CGAL_USE_TBB_THREADS 1 # else # define CGAL_USE_TBB_THREADS 0 # endif #else # define CGAL_USE_TBB_THREADS 0 #endif #if !CGAL_USE_TBB_THREADS # include # include #endif #include // for CGAL::cpp11::atomic namespace CGAL { namespace cpp11 { #if CGAL_USE_TBB_THREADS using std::thread; // std::thread is declared by TBB if TBB_IMPLEMENT_CPP0X == 1 inline void sleep_for (double seconds) { // std::this_thread::sleep_for is declared by TBB if TBB_IMPLEMENT_CPP0X == 1 // It takes interval_t types as argument (!= from the std norm) std::this_thread::sleep_for(tbb::tick_count::interval_t(seconds)); } #else // C++11 implementation using std::thread; inline void sleep_for (double seconds) { // MSVC2013 cannot call `sleep_for()` with other types than // std::chrono::nanoseconds (bug in the implementation of the norm). typedef std::chrono::nanoseconds nanoseconds; nanoseconds ns (nanoseconds::rep (1000000000.0 * seconds)); std::this_thread::sleep_for(ns); } #endif #if defined(CGAL_NO_ATOMIC) && defined(CGAL_LINKED_WITH_TBB) // If did not defined CGAL::cpp11::atomic, then use // std::atomic as a fallback. using std::atomic; #endif } // cpp11 } //namespace CGAL #undef CGAL_USE_TBB_THREADS #endif // CGAL_THREAD_H