Почему pubsetbuf (0, 0) не делает мой поток небуферизованным? - PullRequest
2 голосов
/ 26 мая 2020

Я пытался как можно больше понять буферизацию в 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)
...