C ++ , как язык, возродился за последние несколько лет. Лично я думаю, что есть несколько причин для этого. За последние несколько лет встроенное программирование и устройства IoT стали более распространенными целями разработки, и C ++ стал проще в использовании, поскольку стандартная библиотека и общий синтаксис языка стали более мощными (благодаря auto!). Кроме того, программирование с универсальными типами стало гораздо более распространенным, что делает шаблоны C ++ немного более понятными для тех, кто только начинает.
Вам также может понравиться: Как мы можем контролировать / планировать выполнение потоков в C, C ++?
Одним из ключевых улучшений в стандартной библиотеке является программирование на основе задач. У нас всегда была поддержка потоков, но программирование на основе задач развивалось в течение последних нескольких лет. На этом этапе у вас есть надежный вариант на основе задач с std :: async (.) . Вы должны использовать это! Это надежный, хорошо продуманный и производительный. Если вы не должны. Как вы можете сказать?
std :: async реализации. Таким образом, std :: async (.) Не гарантирует, прежде всего, отдельный поток. Что это делает гарантии является асинхронной обработки (или представлены функции лямбда — выражения ). Это простой способ предоставить возвращаемое значение (конечно, вы можете поделиться переменной, чтобы указать состояние между потоками, но наслаждайтесь синхронизацией этого самостоятельно). Но как это может сделать это, если это не в отдельном потоке?
Пример времени!
C ++
1
...
2
constexpr auto task = []() { return 5 + 2; };
3
auto retfut = std::async(task);
4
const auto retval = retfut.get();
5
std::cout << "Return Value: " << retval << std::endl;
6
...
Что это делает? Немного. (Существуют опции, которые вы можете использовать для принудительного поведения потоков, но они не важны для более распространенного использования std :: async (.) ). Важные вещи, чтобы отметить, являются третьей и четвертой строками. Таким образом, std :: async (.) Вызывается только с одним аргументом.
Когда вы делаете это, вы, по сути, предоставляете во время выполнения опцию либо немедленного вызова в отдельном потоке, либо вызова при вызове get (.) Или wait (.) Для возвращаемого будущего объекта . И среда выполнения почти всегда будет выбирать последний вариант.
Значит ли это, что асинхронность — это ложь? Ну да и нет. Код в (.) Задаче является выполнение асинхронно — хотя она выполняется , когда (.) Прибудет называется метод, он действительно выполнить в другом потоке. Так что это асинхронно, но выполняется точно в срок.
Он также обычно выполняется в потоке, поддерживаемом в пуле потоков, для повышения эффективности — это хорошо. Это идеально подходит для конкретных, определенных задач, таких как чтение из файла или ожидание ответа сети. Это не так хорошо для вещей, которые выполняются неоднократно с течением времени.
Если у вас есть задача, для которой действительно нужен собственный поток, например, сетевой опрос, вам необходимо тщательно продумать, как ее реализовать. Например, вы можете реализовать опрос в задаче, которая содержит цикл — но это приведет к удалению потока из пула потоков, используемого std :: async (.), На неопределенный срок (или до завершения цикла опроса).
Вы также можете выполнить опрос, выполнив цикл в главном потоке и выполнив задачи. Но это по сути будет логически эквивалентно выполнению задач в одном потоке. Работа в задаче будет выполняться в отдельном потоке, но обычно она выполняется только тогда, когда на будущий объект ссылаются с помощью wait (.) Или get (.) .
Если вы используете все ресурсы потока — вы должны использовать один. В первом случае украсть поток из пула потоков — то, что вы не хотите делать. Вам может понадобиться это позже. Второй случай — просто более сложное синхронное выполнение. Лучшее решение? Просто создайте отдельную тему и используйте ее.
Если вы собираетесь использовать поток в течение длительного периода времени, создайте его и используйте его. Если вам просто нужно выполнить что-то вне основного потока, например, ждать ответа по сети или читать большой файл, используйте задачу.
Дальнейшее чтение
Параллельный сокет-сервер TPC / IP с многопоточностью и многопроцессорностью в C
Учебник по Java-потокам: создание потоков и многопоточность в Java