Пространства имён
Варианты
Действия

std::thread::thread

Материал из cppreference.com

 
 
Библиотека поддержки потоков
Потоки
Original:
Threads
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
thread(C++11)
this_thread имен
Original:
this_thread namespace
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
get_id(C++11)
yield(C++11)
sleep_for(C++11)
sleep_until(C++11)
Взаимное исключение
Original:
Mutual exclusion
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
mutex(C++11)
timed_mutex(C++11)
Generic управления замком
Original:
Generic lock management
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
lock_guard(C++11)
unique_lock(C++11)
defer_lock_t
try_to_lock_t
adopt_lock_t
(C++11)
(C++11)
(C++11)
lock(C++11)
try_lock(C++11)
defer_lock
try_to_lock
adopt_lock
(C++11)
(C++11)
(C++11)
Условия переменных
Original:
Condition variables
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
condition_variable(C++11)
condition_variable_any(C++11)
notify_all_at_thread_exit(C++11)
cv_status(C++11)
Futures
Original:
Futures
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
promise(C++11)
future(C++11)
shared_future(C++11)
packaged_task(C++11)
async(C++11)
launch(C++11)
future_status(C++11)
future_error(C++11)
future_category(C++11)
future_errc(C++11)
 
std::thread
Член классов
Original:
Member classes
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
thread::id
Член функций
Original:
Member functions
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
thread::thread
thread::~thread
thread::operator=
Наблюдателей
Original:
Observers
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
thread::joinable
thread::get_id
thread::native_handle
thread::hardware_concurrency
Операции
Original:
Operations
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
thread::join
thread::detach
thread::swap
Не являющиеся членами функций
Original:
Non-member functions
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
std::swap
 
thread();
(1) (начиная с C++11)
thread( thread&& other );
(2) (начиная с C++11)
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
(3) (начиная с C++11)
thread(const thread&) = delete;
(4) (начиная с C++11)
Создает новый объект потока.
Original:
Constructs new thread object.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
1)
Создает новый объект потока, который не представляет собой поток.
Original:
Creates new thread object which does not represent a thread.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
2)
Переместить конструктор. Создает объект потока представляют поток исполнения, который был представлен other. После этого вызова other больше не представляет поток выполнения.
Original:
Move constructor. Constructs the thread object to represent the thread of execution that was represented by other. After this call other no longer represents a thread of execution.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
3)
Создает новый объект std::thread и связывает его с потоком выполнения. Первый конструктор копирует все аргументы args... к локальной памяти потока, как по функции:
Original:
Creates new std::thread object and associates it with a thread of execution. First the constructor copies all arguments args... to thread-local storage as if by the function:
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
template <class T>
typename decay<T>::type decay_copy(T&& v) {
    return std::forward<T>(v);
}
@ @ Любые исключения, при оценке и копирование аргументов бросают в текущем потоке, а не новый нить.
Original:
@@ Any exceptions thrown during evaluation and copying of the arguments are thrown in the current thread, not the new thread.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
@ @ Код, который будет выполняться в новом потоке определяется следующим образом. Обратимся к Nonecopied_args, как t1, t2,..., tN, где N является sizeof...(copied_args)and copied_args is the result of calling decay_copy as defined above. The following code will be run in the new thread:
  • Если f является указателем на функцию-член класса T, то она называется. Возвращаемое значение игнорируется. По сути, выполняется следующий код:
    Original:
    If f is pointer to a member function of class T, then it is called. The return value is ignored. Effectively, the following code is executed:
    The text has been machine-translated via Google Translate.
    You can help to correct and verify the translation. Click here for instructions.
  • (t1.*f)(t2, ..., tN), если тип t1 либо T, ссылка на T или ссылка на тип, производный от T.
    Original:
    (t1.*f)(t2, ..., tN) if the type of t1 is either T, reference to T or reference to type derived from T.
    The text has been machine-translated via Google Translate.
    You can help to correct and verify the translation. Click here for instructions.
  • ((*t1).*f)(t2, ..., tN) иначе.
    Original:
    ((*t1).*f)(t2, ..., tN) otherwise.
    The text has been machine-translated via Google Translate.
    You can help to correct and verify the translation. Click here for instructions.
  • Если N == 1 и f является указателем на объект элемента данных класса, то при обращении к нему. Стоимость объекта игнорируются. По сути, выполняется следующий код:
    Original:
    If N == 1 and f is pointer to a member data object of a class, then it is accessed. The value of the object is ignored. Effectively, the following code is executed:
    The text has been machine-translated via Google Translate.
    You can help to correct and verify the translation. Click here for instructions.
  • t1.*f если и тип t1 либо T, ссылка на T или ссылка на тип, производный от T.
    Original:
    t1.*f if and the type of t1 is either T, reference to T or reference to type derived from T.
    The text has been machine-translated via Google Translate.
    You can help to correct and verify the translation. Click here for instructions.
  • (*t1).*f иначе.
    Original:
    (*t1).*f otherwise.
    The text has been machine-translated via Google Translate.
    You can help to correct and verify the translation. Click here for instructions.
  • f называется указателем на не являющихся членами функции во всех остальных случаях. Возвращаемое значение игнорируется. По сути, f(t1, t2, ..., tN) выполняется.
    Original:
    f is called as a pointer to a non-member function in all other cases. The return value is ignored. Effectively, f(t1, t2, ..., tN) is executed.
    The text has been machine-translated via Google Translate.
    You can help to correct and verify the translation. Click here for instructions.
Original:
@@ The code that will be run in the new thread is defined as follows. Обратимся к Nonecopied_args, как t1, t2,..., tN, где N является sizeof...(copied_args)and copied_args is the result of calling decay_copy as defined above. The following code will be run in the new thread:
  • Если f является указателем на функцию-член класса T, то она называется. Возвращаемое значение игнорируется. По сути, выполняется следующий код:
    Original:
    If f is pointer to a member function of class T, then it is called. The return value is ignored. Effectively, the following code is executed:
    The text has been machine-translated via Google Translate.
    You can help to correct and verify the translation. Click here for instructions.
  • (t1.*f)(t2, ..., tN), если тип t1 либо T, ссылка на T или ссылка на тип, производный от T.
    Original:
    (t1.*f)(t2, ..., tN) if the type of t1 is either T, reference to T or reference to type derived from T.
    The text has been machine-translated via Google Translate.
    You can help to correct and verify the translation. Click here for instructions.
  • ((*t1).*f)(t2, ..., tN) иначе.
    Original:
    ((*t1).*f)(t2, ..., tN) otherwise.
    The text has been machine-translated via Google Translate.
    You can help to correct and verify the translation. Click here for instructions.
  • Если N == 1 и f является указателем на объект элемента данных класса, то при обращении к нему. Стоимость объекта игнорируются. По сути, выполняется следующий код:
    Original:
    If N == 1 and f is pointer to a member data object of a class, then it is accessed. The value of the object is ignored. Effectively, the following code is executed:
    The text has been machine-translated via Google Translate.
    You can help to correct and verify the translation. Click here for instructions.
  • t1.*f если и тип t1 либо T, ссылка на T или ссылка на тип, производный от T.
    Original:
    t1.*f if and the type of t1 is either T, reference to T or reference to type derived from T.
    The text has been machine-translated via Google Translate.
    You can help to correct and verify the translation. Click here for instructions.
  • (*t1).*f иначе.
    Original:
    (*t1).*f otherwise.
    The text has been machine-translated via Google Translate.
    You can help to correct and verify the translation. Click here for instructions.
  • f называется указателем на не являющихся членами функции во всех остальных случаях. Возвращаемое значение игнорируется. По сути, f(t1, t2, ..., tN) выполняется.
    Original:
    f is called as a pointer to a non-member function in all other cases. The return value is ignored. Effectively, f(t1, t2, ..., tN) is executed.
    The text has been machine-translated via Google Translate.
    You can help to correct and verify the translation. Click here for instructions.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
4)
Конструктор копирования удаляется; темы, не копируемой. Нет двух std::thread объекты могут представлять собой тот же поток исполнения.
Original:
The copy constructor is deleted; threads are not copyable. No two std::thread objects may represent the same thread of execution.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

Содержание

[править] Параметры

other -
другой объект потока, чтобы построить этот объект потока с
Original:
another thread object to construct this thread object with
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
f -
Функция для выполнения в новом потоке
Original:
function to execute in the new thread
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
args... -
Аргументы перейти к новой функции
Original:
arguments to pass to the new function
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

[править] Исключения

1-2)
noexcept-спецификация:  
noexcept
  (начиная с C++11)
3)
std::system_error, если поток не может быть запущен. Исключение может представлять std::errc::resource_unavailable_try_again ошибке или другой конкретной реализации ошибку.
Original:
std::system_error if the thread could not be started. The exception may represent the error condition std::errc::resource_unavailable_try_again or another implementation-specific error condition.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

[править] Notes

Аргументы функции потока копируются по значению. Если ссылочный аргумент должен быть передан функции потока, он должен быть обернут (например, с std::ref или std::cref).
Original:
The arguments to the thread function are copied by value. If a reference argument needs to be passed to the thread function, it has to be wrapped (e.g. with std::ref or std::cref).
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Любой возвращаемого значения функции игнорируется. Если функция генерирует исключение, std::terminate называется. Для того чтобы пройти возвращаемых значений или исключений обратно в вызывающую нить, std::promise или std::async могут быть использованы.
Original:
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 or std::async may be used.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

[править] Пример

#include <iostream>
#include <utility>
#include <thread>
#include <chrono>
#include <functional>
#include <atomic>
 
void f1(int n)
{
    for(int i=0; i<5; ++i) {
        std::cout << "Thread " << n << " executing\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));
    }
}
 
int main()
{
    int n = 0;
    std::thread t1; // t1 is not a thread
    std::thread t2(f1, n+1); // pass by value
    std::thread t3(f2, std::ref(n)); // pass by reference
    std::thread t4(std::move(t3)); // t4 is now running f2(). t3 is no longer a thread
    t2.join();
    t4.join();
    std::cout << "Final value of n is " << n << '\n';
}

Возможный вывод:

Thread 1 executing
Thread 2 executing
Thread 1 executing
Thread 2 executing
Thread 1 executing
Thread 2 executing
Thread 1 executing
Thread 2 executing
Thread 1 executing
Thread 2 executing
Final value of n is 5