Я пытался как можно больше понять буферизацию в C ++ (это поразительно сбивает с толку) для программы последовательного ввода-вывода, которую я пишу. Первоначально я не сбрасывал свои выходные команды (из-за незнания), поэтому вместо этого я посмотрел здесь ( Как отключить буферизацию в потоке? ), и он сказал сделать это через my_fstream.rdbuf()->pubsetbuf(0,0)
перед любым Произошла операция ввода-вывода. Это, казалось, улучшило мою производительность, но не исправило это полностью ... Я продолжал искать ответы и нашел эти два вопроса: Не работает небуферизованный ввод-вывод , Небуферизованный вывод с cout, которые оба говорят использовать вместо этого my_fstream.setf(std::ios::unitbuf);
. Это сработало намного лучше, но ни один из этих ответов не объяснял, почему он работает лучше, чем my_fstream.rdbuf()->pubsetbuf(0,0)
.
Разве они не должны делать то же самое? Может кто-нибудь объяснить мне разницу?
Вот код, на котором я это тестирую (устройство отвечает на ввод «Пуск», когда получает его, отправляя обратно «Готово \ r \ n»):
int main(){
std::fstream my_file;
my_file.rdbuf()->pubsetbuf(0, 0);
// my_file.setf(std::ios::unitbuf); // Uncomment this line for testing both cases
my_file.open("/dev/cu.usbmodem14201");
my_file << "Start";
std::this_thread::sleep_for(std::chrono::seconds(10));
}
К тому времени, когда я засыпаю, вывода еще нет (мне нужно подождать 10 секунд, чтобы увидеть его), если я не раскомментирую прокомментированную строку.
Я могу подтвердить сообщения принимаются при запуске отдельной программы python:
with open("/dev/cu.usbmodem14201", "rb") as f:
for line in f:
print(line)