Я пишу программу, которая пишет в двоичный файл из разных потоков.Каждый поток будет записывать в разные позиции файла.Я не использую синхронизацию, и моя программа просто работает.Я хотел бы спросить вас, следует ли мне использовать некоторую синхронизацию и как или достаточно ли этого, чтобы надеяться, что синхронизация ОС сделает это как-то так или иначе.Я нахожусь на Linux, компилятор gcc, но в какой-то момент он может быть запущен и на других платформах.Следующая функция, которую я использую для записи в файл из разных потоков.
void writeBytesFrom(std::string fileName, uint64_t fromPosition, uint8_t* buffer, int numBytes)
{
if(CHAR_BIT != 8)
{
std::stringstream errMsg;
errMsg << "Can not use this platform since CHAR_BIT size is not 8, namely it is "
<< CHAR_BIT << ".";
LOGE << errMsg.str();
throw std::runtime_error(errMsg.str());
}
std::ofstream file(fileName,
std::ios::binary | std::ios::out
| std::ios::in); // Open binary, for output, for input
if(!file.is_open()) // cannot open file
{
std::stringstream errMsg;
errMsg << "Can not open file " << fileName << ".";
LOGE << errMsg.str();
throw std::runtime_error(errMsg.str());
}
file.seekp(fromPosition); // put pointer
std::streampos cur = file.tellp();
file.write((char*)buffer, numBytes);
auto pos = file.tellp();
auto num = pos - cur;
file.close();
if(num != numBytes)
{
std::stringstream errMsg;
errMsg << num << " bytes written from number of bytess that should be written "
<< numBytes << " to " << fileName << ".";
LOGE << errMsg.str();
throw std::runtime_error(errMsg.str());
}
}
Если у вас есть какие-либо дополнительные предложения по улучшению моего кода, я открыт для этого.Причина, по которой я использую буфер uint8_t, заключается в том, что для меня более естественно понимать, что буфер представляет 8-битные байты, чем если бы я использовал, например, unsigned char.Я знаю, что некоторые пуристы могут возразить против этого.
Спасибо, Войта.