std::getline из разных потоков
От: makdak  
Дата: 26.05.17 14:18
Оценка:
всем привет!
Можно ли читать файл из разных потоков при помощи getline()?
в стандарте сказано: (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2760.htm)

To 27.3 Standard iostream objects [iostream.objects], add a new paragraph at the end of the section:

Concurrent access to a synchronized [ios.members.static] standard iostream object's formatted and unformatted input [istream] and output [ostream] functions or a standard C stream by multiple threads shall not result in a data race [intro.multithread]. [Note: Users must still synchronize concurrent use of these objects and streams by multiple threads if they wish to avoid interleaved characters


получается что можно и UB нет? Интересно, как реализована синхронизация чтения.
Отредактировано 29.05.2017 9:47 Кодт . Предыдущая версия .
Re: std::getline из разных потоков
От: LaptevVV Россия  
Дата: 26.05.17 16:24
Оценка: 3 (1)
M>в стандарте сказано: (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2760.htm)

Note: Users must still synchronize concurrent use of these objects and streams by multiple threads if they wish to avoid interleaved characters

M>получается что можно и UB нет? Интересно, как реализована синхронизация чтения.
Ничего не получается.синхронизировать доступ требуется.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: std::getline из разных потоков
От: tdiff  
Дата: 26.05.17 16:47
Оценка: 3 (1)
Здравствуйте, makdak, Вы писали:

M>
M>Concurrent access to a synchronized [ios.members.static] standard iostream object's formatted and unformatted input [istream] and output [ostream] functions or a standard C stream ...
M>


M>получается что можно и UB нет? Интересно, как реализована синхронизация чтения.


В этой цитате, вроде, говорят про standard iostreams (e.g. cin, cout)?
Re[2]: std::getline из разных потоков
От: makdak  
Дата: 26.05.17 17:01
Оценка:
Здравствуйте, LaptevVV, Вы писали:

M>>в стандарте сказано: (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2760.htm)

LVV>

Note: Users must still synchronize concurrent use of these objects and streams by multiple threads if they wish to avoid interleaved characters

M>>получается что можно и UB нет? Интересно, как реализована синхронизация чтения.
LVV>Ничего не получается.синхронизировать доступ требуется.


т.е. data race нет, но она есть, как же так О чем тогда там говорится, не подскажите?

кстати, к msvc++ сказано тоже, thread safe:

http://msdn.microsoft.com/en-us/library/c9ceah3b.aspx:
A single object is thread safe for reading from multiple threads. For example, given an object A, it is safe to read A from thread 1 and from thread 2 simultaneously.

Re[3]: std::getline из разных потоков
От: Ops Россия  
Дата: 27.05.17 09:12
Оценка: 3 (1)
Здравствуйте, makdak, Вы писали:

M>т.е. data race нет, но она есть, как же так О чем тогда там говорится, не подскажите?


О том, что инвариант потоков (stream) нарушен не будет.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: std::getline из разных потоков
От: c-smile Канада http://terrainformatica.com
Дата: 28.05.17 21:01
Оценка:
Здравствуйте, makdak, Вы писали:

M>Можно ли читать файл из разных потоков при помощи getline()?


... какой thread первым успел того и тапки?

Смысл-то в чем?
Re[2]: std::getline из разных потоков
От: makdak  
Дата: 29.05.17 08:53
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Смысл-то в чем?


да я так просто, интереса ради спросил.
а то некоторые говорят, что можно. Хотя:
while (std::getline(...)); // тут проверка на eof не корректна если из разных потоков это происходит.
// т.к. чтение и проверка на ошибки это две разные операции которое надо синхронизировать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.