0 / 0 / 0
Регистрация: 10.02.2016
Сообщений: 2
1

Синхронизация

10.02.2016, 11:33. Показов 433. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите! Препод меня одолел! Работу я выполнил, но я никак не могу найти ответ на вопрос: в чём проблема одновременного выполнения в представленном коде (Ошибочная версия) сразу двух операций ввода-вывода? Ведь они смогут работать параллельно и, теоретически, могли бы выполниться быстрее. О каких именно общих структурах данных идёт речь в программе и что бы вы описали мне сценарий при котором программа при отсутствии синхронизации "портила" бы эти структуры и, соответственно, некорректно работала.
Ошибочная версия:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static HANDLE hFile = CreateFile("c:\\sample.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
 
void main()
{
  OVERLAPPED ovr;
  BYTE Buffer[100];
  if (hFile)
  {
     ovr.Offset = 0;
     WriteFile(hFile, Buffer, 100, NULL, &ovr);
     ovr.Offset = 1024;
     WriteFile(hFile, Buffer, 100, NULL, &ovr);
     WaitForSingleObject(hFile, INFINITE);
     printf(“Данные переписаны!);
  }
Исправленная версия: (верна)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static HANDLE hFile = CreateFile("c:\\sample.txt", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
 
void main()
{
  OVERLAPPED ovr;
  BYTE Buffer[100];
  if (hFile)
  {
     ovr.Offset = 0;
     WriteFile(hFile, Buffer, 100, NULL, &ovr);
   WaitForSingleObject(hFile, INFINITE);  // нужно ожидание после первой записи и всё в этом была ошибка
     ovr.Offset = 1024;
     WriteFile(hFile, Buffer, 100, NULL, &ovr);
     WaitForSingleObject(hFile, INFINITE);
     printf(“Данные переписаны!);
}
CloseHandle (hFile);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.02.2016, 11:33
Ответы с готовыми решениями:

Синхронизация
Пожалуйста ПОМОГИТЕ !!! :help: Разработать класс обеспечивающий работу производителя и...

Mutex - синхронизация
У меня возник вопрос по мьютексам и их синхронизации, видимо, я не понимаю до конца механизм их...

Синхронизация потоков
Здравствуйте. Подскажите пожалуйста. У меня есть три потока. Мне нужно чтобы они запускались...

Синхронизация потоков
Помогите обеспечить синхронизацию потоков const int j=20; hSemaphore = CreateSemaphore(NULL,...

4
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
10.02.2016, 11:56 2
Просто прочти внимательно на MSDN описание функции WriteFile.
Там, в числе прочего, достаточно написано про асинхронный ввод-вывод и
связанные с ним ограничения.
0
0 / 0 / 0
Регистрация: 10.02.2016
Сообщений: 2
16.02.2016, 15:28  [ТС] 3
А где на этом сайте конкретно? Я чет не могу найти.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
16.02.2016, 16:17 4
Идешь в Гугл, вбиваешь в поиск "WriteFile".
Интересующая ссылка, которая ведет на MSDN, будет, как правило, одной из первых.
0
-L
15 / 9 / 12
Регистрация: 03.12.2015
Сообщений: 79
16.02.2016, 16:43 5
777666,

Мне кажется, что тут дело вот в этом

"Because the write operation starts at the offset that is specified in the OVERLAPPED structure, and WriteFile may return before the system-level write operation is complete (write pending), neither the offset nor any other part of the structure should be modified, freed, or reused by the application until the event is signaled (that is, the write completes)."

Ты используешь writefile для асинхронной записи, так сказать. Файл ещё не записан. А ты уже успел вернуться из функции изменить структуру overlapped и запустил запись ещё раз (а структура ещё нужна первой операции вывода). В итоге получишь одновременную запись в одну и ту же память или вообще какую-нибудь фигню.

P.S. приведённая цитата как раз из msdn, который советовал Убеждённый. Подзаголовок "Synchronization and File Position".
0
16.02.2016, 16:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2016, 16:43
Помогаю со студенческими работами здесь

Синхронизация потоков
Добрый день. Помогите пожалуйста написать программу на С++ по синхронизации потоков. Задание такое:...

Синхронизация потоков
в общем есть код: DWORD WINAPI IndexSystemFile::GetFileFromDrive(void *DriveName){...

Синхронизация приложений
Вот такое задание: Написать 2 программы. 1ая – управляющая, 2ая – клиент. Управляющая программа...

Синхронизация потоков
Как переделать с использованием mutex или еще чего нибудь? /*Три нити. Одна генерирует...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru