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

Не удается правильно синхронизировать потоки, критическая секция

11.12.2011, 15:03. Показов 2844. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
доброго времени суток.
необходимо синхронизировать n = 2,4,8,16 потоков чтения записи (используется проекция файла)
загвоздка в том, что иногда 1-3 процесса из 4х (пока пробую n = 4) завершаются с кодом -1073741749 (0xc000004b)
или выскакивает необработанное исключение
вообще не знаю, можно ли в функцию потока помещать помещать работу с критической секцией подобным образом
буду благодарна за любую подсказку )
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <windows.h>
#include <stdio.h>
#include "stdafx.h"
#include <string.h>
#define n 4
 
CRITICAL_SECTION cs;
HANDLE hTh[n];
DWORD ThreadId[n];
 
DWORD WINAPI Func(LPVOID v) 
{
    EnterCriticalSection(&cs);
    char* lpData = (char*)MapViewOfFile((HANDLE)v, FILE_MAP_ALL_ACCESS, 0, 0, 0);
//read write
    UnmapViewOfFile(lpData);
    LeaveCriticalSection(&cs);
return 0;       
}
 
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    InitializeCriticalSection((PCRITICAL_SECTION) &cs);
    HANDLE hFile = CreateFile(TEXT("D:\\study\\3 семестр\\оси\\lab_05\\abc.txt"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    HANDLE hMapping = CreateFileMapping( hFile, NULL, PAGE_READWRITE, 0, 0x0100, TEXT("ABC"));
    if (hMapping == NULL) exit(0);
 
    int i;
    for(i = 0; i < n; i++)
    {
        hTh[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Func, (LPVOID)hMapping, 0, LPDWORD(&ThreadId[i]));
    if ( hTh[i]== NULL) ExitProcess(0);
    }
 
    for(i = 0; i < n; i++)      CloseHandle(hTh[i]);
    CloseHandle(hMapping);
    CloseHandle(hFile);
 
    DeleteCriticalSection ((PCRITICAL_SECTION) &cs);
 
    return(0); 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.12.2011, 15:03
Ответы с готовыми решениями:

Потоки и критическая секция!
Почему потоки проходят 14 раз, а не 10, как указано в MaxCount?????? Помогите с ответом...

Как правильно синхронизировать потоки?
По нажатию кнопки создается N потоков (в данном случае 5): Thread threads = new Thread; ...

Критическая секция
Добрый день. Подскажите пожалуйста: в коде ниже если один поток пишет в file1.txt, другой не сможет...

Критическая секция
такая задача. есть глобальный указатель на структуру. в main -е динамически выделяю память под...

1
935 / 760 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
11.12.2011, 20:21 2
Цитата Сообщение от somebody11 Посмотреть сообщение
int i;
for(i = 0; i < n; i++)
{
hTh[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Func, (LPVOID)hMapping, 0, LPDWORD(&ThreadId[i]));
if ( hTh[i]== NULL) ExitProcess(0);
}
for(i = 0; i < n; i++) CloseHandle(hTh[i]);
CloseHandle(hMapping);
CloseHandle(hFile);
Здесь кроется ошибка в том что основной поток процесса будет уже закрывать всё "хозяйство" (созданные потоки, проецируемый файл, критическую секцию) в плоть до выхода из функций WinMain и никакой работы потоки не увидят.

Вот что набросал я.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <windows.h>
#include <stdio.h>
#define MAX_THREADS  16
#define CLOSE_THREAD(obj)  { for(DWORD i = 0u; i < MAX_THREADS; i++) { CloseHandle(obj[i]); } }
 
CRITICAL_SECTION cs = {0};
HANDLE threads[MAX_THREADS];
 
DWORD WINAPI ThreadFunc(LPVOID param) {
  EnterCriticalSection(&cs);
  // для примера циклический сдвиг текста в лево
  // каждый поток сдвигает текст в файле на один шаг
  char* ptr = (char*) param;
  char  ch  = *ptr;
  while( *ptr = *(ptr + 1))
      *ptr++;
  *ptr = ch;
  *(++ptr) = '\0';
 
  // результат синхронной работы потоков
  static int cnt = 0;
  printf("%d). thread finally\n", ++cnt);
 
  LeaveCriticalSection(&cs);
  return 0;               
}
 
 
int main(void){
  HANDLE hmap = NULL;
  HANDLE fp = CreateFile(TEXT("D:\\text.txt"), GENERIC_READ | GENERIC_WRITE, 0, NULL, 
                                  OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  if(fp == INVALID_HANDLE_VALUE)
       return 1;
 
  if((hmap = CreateFileMapping(fp, NULL, PAGE_READWRITE, 0, 0, NULL)) == NULL) {
       CloseHandle(fp);
       return 1;
  }
 
  char* ptr  = (char*)MapViewOfFile(hmap, FILE_MAP_WRITE, 0, 0, 0);
  if(ptr == NULL) {
       CloseHandle(hmap);
       CloseHandle(fp);
       return 1;
  }
  char* base = ptr;
 
  InitializeCriticalSection(&cs);
 
  for(DWORD i = 0u; i < MAX_THREADS; i++) {
      threads[i] = CreateThread(NULL, 0, ThreadFunc, (LPVOID)ptr, 0, NULL);
      //if(threads[i] == NULL){}
  }
 
  // ждём пока все потоки не завершат свою работу
  WaitForMultipleObjects(MAX_THREADS, threads, TRUE, INFINITE);
 
  UnmapViewOfFile(base);
  CLOSE_THREAD(threads);
  CloseHandle(hmap);
  CloseHandle(fp);
  DeleteCriticalSection(&cs);
 
  puts("End threads.");
  getchar();
  return 0; 
}
Цитата Сообщение от somebody11 Посмотреть сообщение
вообще не знаю, можно ли в функцию потока помещать помещать работу с критической секцией подобным образом
Конечно можно, но вот само проецирование на физ-память из страничного файла и прекращение проецирования в потоках лучше не далать.
2
11.12.2011, 20:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.12.2011, 20:21
Помогаю со студенческими работами здесь

Критическая секция
Есть процесс в нем создается 2 потока, проблема в том, что когда один из потоков находится в...

Критическая секция
Привет! Вот я уже как дня 2 маюсь с критической секцией CriticalSection.Enter; CS.Enter; ...

Критическая секция
Очень срочно,помогите пожалуйста,на Сях,реализовать работу бензоколонки - бензин 80,92,95,98,Дизель...

Критическая секция
Требуется применить критическую секцию для процессов через разделяемую память. Ниже привел участок...


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

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

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