2016-10-17 3 views
0

Если я создам объект std :: async в классе, как долго выполняется соответствующий поток? До тех пор, пока не будет вызван дескриптор содержащего класса (Bar)?Как долго работает std :: async?

class Bar { 

public: 

Bar() { 
    handle = std::async(
       std::launch::async, 
       &Bar:foo, this); 
} 

... 

void Foo() { 
    while (true) {//do stuff//} 

} 

private: 
    std::future<void> handle; 

}; 

EDIT:

Как долго пробег потока в следующем примере:

class Bar { 

public: 

Bar() : thread(&Bar:foo, this) { 
} 

... 

void Foo() { 
    while (true) {//do stuff//} 

} 

private: 
    std::thread thread; 

}; 

ответ

2

Асинхронная операция проходит до возврата. Если у вас бесконечный цикл, он будет работать вечно. На самом деле нет безопасного способа «прервать» асинхронную операцию. Вы должны использовать потоковую связь, чтобы сказать, чтобы она прекратила работу.

Если вы уничтожаете связанное будущее, оно будет блокироваться до тех пор, пока операция не будет выполнена.

Нить, поддерживающая операцию, может выходить за ее пределы, если в реализации используется пул потоков, но вам не стоит беспокоиться об этом.

+0

Спасибо, очень проницательный. Правильно ли я понимаю вас, что для периодических задач (например, очистка) в качестве функции Foo в моем примере следует использовать std :: threads вместо std :: async? – user695652

+0

Обратите внимание, что в соответствии со стандартом C++ компилятору разрешено завершать или оптимизировать поток, который будет работать бесконечно. – rubenvb

Смежные вопросы