2013-08-29 4 views
5

Так это выглядит довольно просто:Зачем вам явно вступать в потоки?

#include <iostream> 
#include <thread> 

void second() { 
    cout << "Don't thread on me!" << endl; 
} 

int main() { 
    thread t { second }; 
    t.join(); 

    return 0; 
    cin.get(); 
} 

Если я не включаю join() то система вызывает abort(). Я не понимаю этого, не должен ли поток выходить сам по себе? Присоединение к потокам похоже на то, что код будет сложнее инкапсулировать должным образом. Что с этим связано?

+2

Вот хорошее чтение об этом: http://www.domaigne.com/blog/computing/joinable-and- отсоединенные потоки/ – LarryPel

+2

'main' должен возвращать' int'. – chris

+2

Это не скомпилируется, потому что отсутствует пара директив '# include'. http://sscce.org/ –

ответ

4

Это часть дизайна библиотеки потоков C++. Вы не нужно до join нить, вы также можете detach. Но я бы не рекомендовал, чтобы вы по умолчанию использовали detach -интерфейсы, так как это приводит к собственному набору осложнений.

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

Для различных вещей, которые вы можете выбрать различные уровни абстракции, например:

int main() { 
    auto f = std::async([](){ std::cout << "Don't tread on me\n" << std::flush; }); 
    f.get();  // Wait for the task to complete 
} 
+0

А, я еще не коснулся «async». – sircodesalot

+0

@sircodesalot: 'thread' являются примитивами низкого уровня. Даже 'std :: future <>'/'std :: prom <>'/'std :: async' не являются тем высоким уровнем, но стандарт должен начинаться с чего-то, что можно было бы согласовать. Я предполагаю, что в ближайшем будущем для стандартизации будут предложены все более высокие уровни. И уже есть библиотеки для параллелизма, которые предлагают инструменты более высокого уровня. –

+0

** 30.3.1.3 ** [Примечание: либо неявное отключение или соединение поток joinable() в своем деструкторе может привести к затруднению отладки правильности (для отсоединения) или ошибок производительности (для объединения), встречающихся только тогда, когда исключение поднял. Таким образом, программист должен обеспечить, чтобы деструктор никогда не выполнялся, пока поток все еще соединяется. -end note] – Jason

4

По умолчанию потоки должны соединяться так, чтобы нерестовый поток мог отслеживать и ждать завершения своих дочерних элементов (например, вы делегируете кучу работы в 2+ потоки, а затем присоединяете их все, чтобы сигнализировать, когда работа сделанный).

Вы можете использовать detach, чтобы заставить поток отсоединиться от своей нерестовой нити, и это приведет к тому, что потоки будут работать независимо.

+0

Aha! Это интересно. – sircodesalot

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