Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::thread::thread

      From cppreference.com
      <cpp‎ |thread‎ |thread
       
       
      Concurrency support library
      Threads
      (C++11)
      (C++20)
      this_thread namespace
      (C++11)
      (C++11)
      (C++11)
      Cooperative cancellation
      Mutual exclusion
      Generic lock management
      (C++11)
      (C++11)
      (C++11)
      (C++11)
      Condition variables
      (C++11)
      Semaphores
      Latches and Barriers
      (C++20)
      (C++20)
      Futures
      (C++11)
      (C++11)
      (C++11)
      Safe reclamation
      Hazard pointers
      Atomic types
      (C++11)
      (C++20)
      Initialization of atomic types
      (C++11)(deprecated in C++20)
      (C++11)(deprecated in C++20)
      Memory ordering
      (C++11)(deprecated in C++26)
      Free functions for atomic operations
      Free functions for atomic flags
       
       
      thread()noexcept;
      (1)(since C++11)
      thread( thread&& other)noexcept;
      (2)(since C++11)
      template<class F,class...Args>
      explicit thread( F&& f, Args&&...args);
      (3)(since C++11)
      thread(const thread&)= delete;
      (4)(since C++11)

      Constructs a newstd::thread object.

      1) Creates a newstd::thread object which does not represent a thread.
      2) Move constructor. Constructs thestd::thread object to represent the thread of execution that was represented byother. After this callother no longer represents a thread of execution.
      3) Creates a newstd::thread object and associates it with a thread of execution. The new thread of execution starts executing:

      INVOKE(decay-copy(std::forward<F>(f)),
             decay-copy(std::forward<Args>(args))...)

      (until C++23)

      std::invoke(auto(std::forward<F>(f)),
                 auto(std::forward<Args>(args))...)

      (since C++23)
      The calls ofdecay-copy are evaluated(until C++23)The values produced byauto arematerialized(since C++23) in the current thread, so that any exceptions thrown during evaluation and copying/moving of the arguments are thrown in the current thread, without starting the new thread.
      This overload participates in overload resolution only ifstd::decay<F>::type(until C++20)std::remove_cvref_t<F>(since C++20) is not the same type asstd::thread.

      If any of the following conditions is satisfied, the program is ill-formed:

      (until C++20)

      If any of the following isfalse, the program is ill-formed:

      (since C++20)
      The completion of the invocation of the constructorsynchronizes with the beginning of the invocation of the copy off on the new thread of execution.
      4) The copy constructor is deleted; threads are not copyable. No twostd::thread objects may represent the same thread of execution.

      Contents

      [edit]Parameters

      other - another thread object to construct this thread object with
      f -Callable object to execute in the new thread
      args - arguments to pass to the new function

      [edit]Postconditions

      1)get_id() equal tostd::thread::id() (i.e.joinable() isfalse).
      2)other.get_id() equal tostd::thread::id() andget_id() returns the value ofother.get_id() prior to the start of construction.
      3)get_id() not equal tostd::thread::id() (i.e.joinable() istrue).

      [edit]Exceptions

      3)std::system_error if the thread could not be started. The exception may represent the error conditionstd::errc::resource_unavailable_try_again or another implementation-specific error condition.

      [edit]Notes

      The arguments to the thread function are moved or copied by value. If a reference argument needs to be passed to the thread function, it has to be wrapped (e.g., withstd::ref orstd::cref).

      Any return value from the function is ignored. If the function throws an exception,std::terminate is called. In order to pass return values or exceptions back to the calling thread,std::promise orstd::async may be used.

      [edit]Example

      Run this code
      #include <chrono>#include <iostream>#include <thread>#include <utility> void f1(int n){for(int i=0; i<5;++i){std::cout<<"Thread 1 executing\n";++n;std::this_thread::sleep_for(std::chrono::milliseconds(10));}} void f2(int& n){for(int i=0; i<5;++i){std::cout<<"Thread 2 executing\n";++n;std::this_thread::sleep_for(std::chrono::milliseconds(10));}} class foo{public:void bar(){for(int i=0; i<5;++i){std::cout<<"Thread 3 executing\n";++n;std::this_thread::sleep_for(std::chrono::milliseconds(10));}}int n=0;}; class baz{public:void operator()(){for(int i=0; i<5;++i){std::cout<<"Thread 4 executing\n";++n;std::this_thread::sleep_for(std::chrono::milliseconds(10));}}int n=0;}; int main(){int n=0;    foo f;    baz b;std::thread t1;// t1 is not a threadstd::thread t2(f1, n+1);// pass by valuestd::thread t3(f2,std::ref(n));// pass by referencestd::thread t4(std::move(t3));// t4 is now running f2(). t3 is no longer a threadstd::thread t5(&foo::bar,&f);// t5 runs foo::bar() on object fstd::thread t6(b);// t6 runs baz::operator() on a copy of object b    t2.join();    t4.join();    t5.join();    t6.join();std::cout<<"Final value of n is "<< n<<'\n';std::cout<<"Final value of f.n (foo::n) is "<< f.n<<'\n';std::cout<<"Final value of b.n (baz::n) is "<< b.n<<'\n';}

      Possible output:

      Thread 1 executingThread 2 executingThread 3 executingThread 4 executingThread 3 executingThread 1 executingThread 2 executingThread 4 executingThread 2 executingThread 3 executingThread 1 executingThread 4 executingThread 3 executingThread 2 executingThread 1 executingThread 4 executingThread 3 executingThread 1 executingThread 2 executingThread 4 executingFinal value of n is 5Final value of f.n (foo::n) is 5Final value of b.n (baz::n) is 0

      [edit]Defect reports

      The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

      DRApplied toBehavior as publishedCorrect behavior
      LWG 2097C++11for overload(3),F could bestd::threadF is constrained
      LWG 3476C++20overload(3) directly required (the decayed types of)
      F and the argument types to be move constructible
      removed these
      requirements[1]
      1. The move-constructibility is already indirectly required bystd::is_constructible_v.

      [edit]References

      • C++23 standard (ISO/IEC 14882:2024):
      • 33.4.3.3 thread constructors [thread.thread.constr]
      • C++20 standard (ISO/IEC 14882:2020):
      • 32.4.2.2 thread constructors [thread.thread.constr]
      • C++17 standard (ISO/IEC 14882:2017):
      • 33.3.2.2 thread constructors [thread.thread.constr]
      • C++14 standard (ISO/IEC 14882:2014):
      • 30.3.1.2 thread constructors [thread.thread.constr]
      • C++11 standard (ISO/IEC 14882:2011):
      • 30.3.1.2 thread constructors [thread.thread.constr]

      [edit]See also

      constructs newjthread object
      (public member function ofstd::jthread)[edit]
      C documentation forthrd_create
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/thread/thread/thread&oldid=169925"

      [8]ページ先頭

      ©2009-2025 Movatter.jp