Я нахожу, что чрезвычайно легче использовать потоки в c ++ вместо функций окон как ReadFile, WriteFile, и т.д. или даже fprintf. Когда не хорошо использовать потоки? Когда хорошо использовать потоки? Действительно ли безопасно использовать потоки? Каким образом много программистов не использует потоки?
Это - просто что-то, о чем я всегда задавался вопросом, и возможно Вы можете потерять некоторую мудрость.
Когда нехорошо использовать потоки?
Когда хорошо использовать потоки?
В общем случае.
Безопасно ли использовать потоки?
Да, но нужно быть осторожным при асинхронном распределении потока.
Почему многие программисты не используют потоки?
Предпочтения, стиль, или они сначала выучили другой метод (или другой язык). Я нахожу, что много старых примеров "c++" в интернете написаны с C-образным вкусом, предпочитая printf, а не cout.
Потоки, как правило, вполне безопасны. При некоторых обстоятельствах они могут быть медленными и/или неуклюжими. Медленные, в основном, возникают из-за того, что они накладывают несколько дополнительных уровней между вашим кодом и операционной системой, и при неправильных обстоятельствах эти уровни могут добавлять накладные расходы. Неуклюжесть, в основном, по сравнению с C printf, а не прямое использование чего-то вроде WriteFile (который напрямую не поддерживает форматирование вообще). Например, рассмотрим:
printf("%2.2x", ch);`
-
std::cout << std::hex << std::setw(2) << std::setprecision(2) << std::setfill('0') << ch;
std::cout << setfill(' ');
Тогда учтите тот факт, что если вас волнует i18n, printf
использует строку, которую легко читать из внешнего источника, где поток C++ встраивает все форматирование в структуру кода, так что практически любое изменение форматирования требует переписывания кода, перекомпиляции и перекомпоновки.
CreateFile, ReadFile
и т.д. также позволяют ряд вещей, таких как файлы с отображением в памяти и перекрытием чтения и записи, которые вообще не поддерживаются iostreams. Если ситуация позволяет вам использовать их с пользой, iostreams часто не будет конкурентоспособным.
Вы не можете сделать асинхронный файл ввода / вывода с потоками ...
Когда вы хотите ваше приложение быть портативным на разные платформы.
Когда вы хотите более краткий код: функции Win32 имеют более сложные семантики, часто требуют набора функций, чтобы сделать что-то, и определенно иметь больше параметров.
Одной из причин, по которым мне нравится PrintF (), является то, что сами форматические строки могут быть ресурсами, что позволяет для более внешнего контроля над выходом программы без форсирования перекомпиляции.
Одной из причин, по которым мне нравится Cout (), это сырая скорость.
В моем опыте это имеет тенденцию быть довольно религиозной проблемой.
Одной из причин I18N
string time = "4:32";
cout << "the current time is " << time;
cout << "वर्तमान समय " << time << " है।"
cout << time << "في الوقت الحالي هو";
против
string format = "the current time is %s";
string format = "वर्तमान समय %s है।";
string format = "%s في الوقت الحالي هو";
printf(format, time);