LINUX.ORG.RU

ofstream


0

0

Делаю две программульки: 1) #include <stdio.h> #include <stdlib.h> #include <fstream> #include <iostream> using namespace std int main (int argc, char *argv[]) { ofstream outline("proba"); for (int i=0; i<10000000;i++) outfile << "aaaaaaaaaaaaaaaaaaaa\n"; return 0; } 2) #include <stdio.h> #include <stdlib.h> #include <fstream> #include <iostream> using namespace std int main (int argc, char *argv[]) { ofstream outline("proba"); for (int i=0; i<10000000;i++) outfile << "bbbbbbbbbbbbbbbbbbb\n"; return 0; }

Запускаю prog1& prog2& Смотрю cat proba | grep ab И почему получаются строки типа aaaaabbbbbbbb ??

anonymous

А что должно быть?

Если смущает число буковок, то добро пожпловать в мир многозадачных ОС.

alexru ★★★★
()

Возможно, поведение вызвано тем что, буфер стрима сбрасывается в произвольном месте в середине строки (а не только после \n); Ситуацию _может_ улучшить (но будут дикие тормоза) замена
outfile << "bbbbbbbbbbbbbbbbbbb\n";
на
outfile << "bbbbbbbbbbbbbbbbbbb\n" <<flush;

GPFault ★★
()
Ответ на: комментарий от GPFault

<< flush всё равно не гарантирует того что строки, записываемые разными процессами не смешиваютя (в моём примере на 20000000 строк 3 получились некоректные). У меня задача из нескольких thread записывать в один файл текстовые строки так чтобы они не перекрывались. В win это получается, а в Linux как быть? посоветуйте пожалуйста.

anonymous
()
Ответ на: комментарий от anonymous


Может имеет смысл воспользоваться семафорами или shared memory для
синхронизации?

elenath
()
Ответ на: комментарий от anonymous

> а в Linux как быть? посоветуйте пожалуйста.

Завести мутекс и защитить запись в файл мутексом. Тогда потоки будут писать строго по очереди.

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от watashiwa_daredeska

Про потоки оставим, а всё таки в начале темы я писал про две программы, а тут как быть, что я не так сделал?

anonymous
()
Ответ на: комментарий от anonymous

Используй "мягкие" блокировки файла через fcntl (man 2 fcntl):
1) перед записью блокируешь файл
2) пишешь в файл через ofstream как обычно
3) делаешь ofstream-у flash
4) снимаешь блокировку

romanSA
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.