Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,860

Не собирается и не запускается решение. Формирование матрицы и синхронизация потоков функцией взаимоблокировки

19.05.2019, 21:47. Показов 1409. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Этот код сделан ко второму пункту задания (см.скрин).
Кликните здесь для просмотра всего текста
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <time.h>
#include <process.h>
#include <cstdio>
// функция потока для строки матрицы (используются функции взаимоблокировки)
unsigned __stdcall HandlerRowMatrixInterlockedFunctions(void *lpParameter);
// функция потока для строки матрицы (используются критические секции)
unsigned __stdcall HandlerRowMatrixCriticalSection(void *lpParameter);
// функция потока для строки матрицы (используется тонкая блокировка чтения и записи)
unsigned __stdcall HandlerRowMatrixSRWLock(void *lpParameter);
int n_rows; // количество строк матрицы
int n_cols; // количество столбцов матрицы
long total = 0; // количество двузначных чисел
int max = 0, min = 999; // максимальное и минимальное значения
CRITICAL_SECTION cs; // критическая секция
SRWLOCK SRWLock; // тонкая блокировка чтения и записи
                 // ------------------------------------------------------------------------------------------------
int _tmain()
{
    _tsetlocale(LC_ALL, TEXT(""));
    _tprintf(TEXT("Введите количество строк матрицы: "));
    _tscanf_s(TEXT("%d"), &n_rows);
    _tprintf(TEXT("Введите количество столбцов матрицы: "));
    _tscanf_s(TEXT("%d"), &n_cols);
    _tprintf(TEXT("Выберите механизм синхронизации потоков: \n\
\t1: Функции взаимоблокировки\n\
\t2: Критические секции\n\
\t3: Тонкая блокировка чтения и записи\n"));
    int mode = _getch();
    _tprintf(TEXT("\n"));
    if ((n_rows > 1) && (n_cols > 1) && ('1' <= mode && mode <= '3'))
    {
        srand((unsigned int)time(NULL));
        // создаём матрицу и заполняем её случайными значениямя от 0 до 999
        int** matrix = new int*[n_rows];
        for (int i = 0; i < n_rows; ++i)
        {
            matrix[i] = new int[n_cols];
            for (int j = 0; j < n_cols; ++j)
            {
                int value = rand() % 1000; // генерируем случайное число от 0 до 999
                matrix[i][j] = value;
                _tprintf(TEXT("%3d "), value);
            } // for
            _tprintf(TEXT("\n"));
        } // for
 
        _tprintf(TEXT("\n"));
 
        // создаём массив потоков для строк матрицы
        HANDLE* threads = new HANDLE[n_rows];
          // функции взаимоблокировки
            for (int i = 0; i < n_rows; ++i)
            {
                threads[i] = (HANDLE)_beginthreadex(NULL, 0, HandlerRowMatrixInterlockedFunctions, (void *)matrix[i], 0, NULL);
            } // for
          // ждём завершения всех созданных потоков
        WaitForMultipleObjects(n_rows, threads, TRUE, INFINITE);
        // выводим результаты
        _tprintf(TEXT("Количество двузначных чисел: %d\n"), total);
        _tprintf(TEXT("Максимальный элемент: %d\n"), max);
        _tprintf(TEXT("Минимальный элемент: %d\n"), min);
        // освобождаем ресурсы
        for (int i = 0; i < n_rows; ++i)
        {
            // удаляем строку матрицы
            delete[] matrix[i];
            // закрываем дискриптор созданного потока
            CloseHandle(threads[i]);
        } // for
          // удаляем массив потоков
        delete[] threads;
        // удаляем матрицу
        delete[] matrix;
        if ('2' == mode)
        {
            DeleteCriticalSection(&cs); // удаляем критическию сессию
        } // if
    } // if
} // _tmain
  // ------------------------------------------------------------------------------------------------
unsigned __stdcall HandlerRowMatrixInterlockedFunctions(void *lpParameter)
{
    const int *row = (const int *)lpParameter; // строка матрицы
    int jMax = 0, jMin = 0; // индексы максимального и минимального элемента в строке матрицы
    for (int j = 0; j < n_cols; ++j)
    {
        if (9 < row[j] && row[j] < 100) // двузначное число
        {
            // увеличим на единицу количество двузначных чисел
            InterlockedIncrement(&total);
        } // if
        if (row[j] > row[jMax])
        {
            jMax = j; // запомним индекс максимального значения
        } // if
        else if (row[j] < row[jMin])
        {
            jMin = j; // запомним индекс минимального значения
        } // if
    } // for
    static long lock = 0; // начальное значение «свободно»
                          // циклическая блокировка (spinlock)
                          // записываем значение «занято»
    while (InterlockedExchange(&lock, 1) != 0) SwitchToThread();
    if (row[jMax] > max) max = row[jMax]; // определяем максимальный элемент
    if (row[jMin] < min) min = row[jMin]; // определяем минимальный элемент
    InterlockedExchange(&lock, 0); // записываем значение «свободно»
    return 0;
} // HandlerRowMatrixInterlockedFunctions
  // ------------------------------------------------------------------------------------------------
unsigned __stdcall HandlerRowMatrixCriticalSection(void *lpParameter)
{
    const int *row = (const int *)lpParameter; // строка матрицы
    long count = 0; // количество двузначных чисел в строке матрицы
    int jMax = 0, jMin = 0; // индексы максимального и минимального элемента в строке матрицы
    for (int j = 0; j < n_cols; ++j)
    {
        if (9 < row[j] && row[j] < 100) // двузначное число
        {
            // увеличим на единицу количество двузначных чисел
            ++count;
        } // if
        if (row[j] > row[jMax])
        {
            jMax = j; // запомним индекс максимального значения
        } // if
        else if (row[j] < row[jMin])
        {
            jMin = j; // запомним индекс минимального значения
        } // if
    } // for
    EnterCriticalSection(&cs); // входим в критическую секцию
    total += count; // увеличиваем количество двузначных чисел
    if (row[jMax] > max) max = row[jMax]; // определяем максимальный элемент
    if (row[jMin] < min) min = row[jMin]; // определяем минимальный элемент
    LeaveCriticalSection(&cs); // покидаем критическую секцию
    return 0;
} // HandlerRowMatrixCriticalSection
  // ------------------------------------------------------------------------------------------------
unsigned __stdcall HandlerRowMatrixSRWLock(void *lpParameter)
{
    const int *row = (const int *)lpParameter; // строка матрицы
    long count = 0; // количество двузначных чисел в строке матрицы
    int jMax = 0, jMin = 0; // индексы максимального и минимального элемента в строке матрицы
    for (int j = 0; j < n_cols; ++j)
    {
        if (9 < row[j] && row[j] < 100) // двузначное число
        {
            // увеличим на единицу количество двузначных чисел
            ++count;
        } // if
        if (row[j] > row[jMax])
        {
            jMax = j; // запомним индекс максимального значения
        } // if
        else if (row[j] < row[jMin])
        {
            jMin = j; // запомним индекс минимального значения
        } // if
    } // for
    AcquireSRWLockExclusive(&SRWLock); // получаем монопольный доступ
    total += count; // увеличиваем количество двузначных чисел
    if (row[jMax] > max) max = row[jMax]; // определяем максимальный элемент
    if (row[jMin] < min) min = row[jMin]; // определяем минимальный элемент
    ReleaseSRWLockExclusive(&SRWLock); // освобождаем монопольный доступ
    return 0;
} // HandlerRowMatrixSRWLock
Миниатюры
Не собирается и не запускается решение. Формирование матрицы и синхронизация потоков функцией взаимоблокировки   Не собирается и не запускается решение. Формирование матрицы и синхронизация потоков функцией взаимоблокировки  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.05.2019, 21:47
Ответы с готовыми решениями:

Синхронизация потоков на элементарном уровне (переключение потоков)
в общем разбираюсь с потоками, на сколько понял мне нужен lock Вот имеется просто пример public void RunAdd() ...

Синхронизация потоков: проблема гонки потоков
Есть проблема в синхронизации потоков, которую я не знаю, как решить. Точнее у меня получается типичная гонка потоков. Есть функция,...

Проект собирается, но не запускается
При запуске проекта вижу: Запускается...

15
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
19.05.2019, 22:41
xamelione25, а где твоя функция WinMain? У десктопных приложений точкой входа является функция WinMain, в отличие от консольных, где точкой входа является функция main.
0
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,860
19.05.2019, 22:44  [ТС]
nonedark2008, а где она должна быть....и что нужно прописать конкретно...я просто сам ещё в С++ как здравствуй дерево....
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
19.05.2019, 22:54
xamelione25, просто вместо int main() подставь
C++
1
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
1
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,860
20.05.2019, 08:01  [ТС]
nonedark2008,
Миниатюры
Не собирается и не запускается решение. Формирование матрицы и синхронизация потоков функцией взаимоблокировки  
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
20.05.2019, 08:58
xamelione25, попробуй заменить LPTSTR на LPSTR
0
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,860
20.05.2019, 15:19  [ТС]
nonedark2008, все теперь собирается но на запускается...оно моментально завершается
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
20.05.2019, 16:00
xamelione25, так, я не до конца понял.
Тебе какое приложение необходимо: консольное или десктопное?
Если первое, то тебе в Visual Studio необходимо создавать консольный проект и использовать функцию main. Если второе, создавать нужно десктопный проект и использовать функцию WinMain.

Судя по твоему коду, тебе нужно именно консольное. Создай его и перетащи туда весь свой код без изменений.
1
15 / 13 / 3
Регистрация: 14.05.2019
Сообщений: 64
20.05.2019, 16:05
nonedark2008, не отвечай таким-хамам, пусть на ответы идет, а-то нюх потеряли вовсе
0
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,860
20.05.2019, 21:01  [ТС]
nonedark2008, Да я вроде бы уже все нормально сделал. Но у меня при выборе case прога просто вылетает (как только я нажимаю любую цифру).
Такое впечатление что у меня не хватает что-то вроде "readln" в конце написать - как в паскале.
Кликните здесь для просмотра всего текста
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <time.h>
#include <process.h>
#include <cstdio>
// функция потока для строки матрицы (используются функции взаимоблокировки)
unsigned __stdcall HandlerRowMatrixInterlockedFunctions(void *lpParameter);
int n_rows; // количество строк матрицы
int n_cols; // количество столбцов матрицы
long total = 0; // количество двузначных чисел
int max = 0, min = 999; // максимальное и минимальное значения
CRITICAL_SECTION cs; // критическая секция
SRWLOCK SRWLock; // тонкая блокировка чтения и записи
// ---------------------------------------------------------------------------
int _tmain()
{
    _tsetlocale(LC_ALL, TEXT(""));
    _tprintf(TEXT("Введите количество строк матрицы: "));
    _tscanf_s(TEXT("%d"), &n_rows);
    _tprintf(TEXT("Введите количество столбцов матрицы: "));
    _tscanf_s(TEXT("%d"), &n_cols);
    _tprintf(TEXT("Выберите механизм синхронизации потоков: \n\
\t1: Функции взаимоблокировки\n"));
    int mode = _getch();
    _tprintf(TEXT("\n"));
    if ((n_rows > 1) && (n_cols > 1) && ('1' <= mode && mode <= '1'))
    {
        srand((unsigned int)time(NULL));
        // создаём матрицу и заполняем её случайными значениямя от 0 до 999
        int** matrix = new int*[n_rows];
        for (int i = 0; i < n_rows; ++i)
        {
            matrix[i] = new int[n_cols];
            for (int j = 0; j < n_cols; ++j)
            {
                int value = rand() % 1000; // генерируем случайное число от 0 до 999
                matrix[i][j] = value;
                _tprintf(TEXT("%3d "), value);
            } // for
            _tprintf(TEXT("\n"));
        } // for
        _tprintf(TEXT("\n"));
        // создаём массив потоков для строк матрицы
        HANDLE* threads = new HANDLE[n_rows];
        switch (mode)
        {
        case '1': // функции взаимоблокировки
            for (int i = 0; i < n_rows; ++i)
            {
                threads[i] = (HANDLE)_beginthreadex(NULL, 0, HandlerRowMatrixInterlockedFunctions, (void *)matrix[i], 0, NULL);
            } // for
            break;
        } // switch
        // ждём завершения всех созданных потоков
        WaitForMultipleObjects(n_rows, threads, TRUE, INFINITE);
        // выводим результаты
        _tprintf(TEXT("Количество двузначных чисел: %d\n"), total);
        _tprintf(TEXT("Максимальный элемент: %d\n"), max);
        _tprintf(TEXT("Минимальный элемент: %d\n"), min);
        // освобождаем ресурсы
        for (int i = 0; i < n_rows; ++i)
        {
            // удаляем строку матрицы
            delete[] matrix[i];
            // закрываем дискриптор созданного потока
            CloseHandle(threads[i]);
        } // for
        // удаляем массив потоков
        delete[] threads;
        // удаляем матрицу
        delete[] matrix;
 
        if ('2' == mode)
        {
            DeleteCriticalSection(&cs); // удаляем критическию сессию
        } // if
    } // if
} // _tmain
// ------------------------------------------------------------------------------------------------
unsigned __stdcall HandlerRowMatrixInterlockedFunctions(void *lpParameter)
{
    const int *row = (const int *)lpParameter; // строка матрицы
    int jMax = 0, jMin = 0; // индексы максимального и минимального элемента в строке матрицы
    for (int j = 0; j < n_cols; ++j)
    {
        if (9 < row[j] && row[j] < 100) // двузначное число
        {
            // увеличим на единицу количество двузначных чисел
            InterlockedIncrement(&total);
        } // if
        if (row[j] > row[jMax])
        {
            jMax = j; // запомним индекс максимального значения
        } // if
        else if (row[j] < row[jMin])
        {
            jMin = j; // запомним индекс минимального значения
        } // if
    } // for
    static long lock = 0; // начальное значение «свободно»
    // циклическая блокировка (spinlock)
    // записываем значение «занято»
    while (InterlockedExchange(&lock, 1) != 0) SwitchToThread();
    if (row[jMax] > max) max = row[jMax]; // определяем максимальный элемент
    if (row[jMin] < min) min = row[jMin]; // определяем минимальный элемент
    InterlockedExchange(&lock, 0); // записываем значение «свободно»
    return 0;
} // HandlerRowMatrixInterlockedFunctions
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
20.05.2019, 22:19
Лучший ответ Сообщение было отмечено xamelione25 как решение

Решение

Цитата Сообщение от xamelione25 Посмотреть сообщение
Такое впечатление что у меня не хватает что-то вроде "readln" в конце написать
Вариантов несколько, бери любой:
1. В Visual Studio запускай проект через Ctrl+F5;
2. В режиме отладки поставь точку останова на конец программы;
3. Допиши в конце программы либо system("pause"), либо любую другую операцию, ожидающую пользовательского ввода (scanf, gets, cin.get() и т.п.).
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
20.05.2019, 23:08
Цитата Сообщение от xamelione25 Посмотреть сообщение
Но у меня при выборе case прога просто вылетает (как только я нажимаю любую цифру).
Такое впечатление что у меня не хватает что-то вроде "readln" в конце написать - как в паскале.
Попробуй дописать
C++
1
2
3
4
        } // if
    } // if
    return 0;
} // _tmain
1
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
20.05.2019, 23:45
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Попробуй дописать
Не требуется. Если return отсутствует, то компилятор подставит его автоматически.

Добавлено через 5 минут
Из стандарта:
6.6.1 main function [basic.start.main]
... If control flows off the end of the compound-statement of main, the effect is equivalent to a return with operand 0
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
20.05.2019, 23:58
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Не требуется. Если return отсутствует, то компилятор подставит его автоматически.
Ну, стандарт стандартом, но лучше прописывать явно.
Хотя, в данном случае подозреваю, что выражение "прога просто вылетает (как только я нажимаю любую цифру)" означает, что программа корректно завершается, но ничего не печатает. А не печатает, потому что там && ('1' <= mode && mode <= '1'))
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
21.05.2019, 00:10
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А не печатает, потому что там && ('1' <= mode && mode <= '1'))
С этим никаких проблем нет. Просто консоль мгновенно закрывается после вывода результата. Как это решается, я описал выше.
1
 Аватар для xamelione25
-4 / 5 / 2
Регистрация: 04.02.2013
Сообщений: 1,860
21.05.2019, 07:58  [ТС]
nonedark2008, oleg-m1973, спасибо, помог 11 пост. п.1
Миниатюры
Не собирается и не запускается решение. Формирование матрицы и синхронизация потоков функцией взаимоблокировки  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.05.2019, 07:58
Помогаю со студенческими работами здесь

Проект собирается, но не запускается
Здравствуйте! У меня в Qt Creator проект собирается успешно, но при попытке его запустить вижу это (на аттаче). Что бы это могло быть?...

Синхронизация потоков с#
Здравствуйте. Задача у меня такая: нужно, чтобы три потока асинхронно брали из List слова и записывали их в файл, предварительно приведя к...

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

Синхронизация потоков
Помогите правильно синхронизировать потоки, при выполнении вылетают ошибки, типа: &quot;Socket operation on non-socket&quot; ...

Синхронизация потоков
Снова привет. Есть у меня код, который требуется раскидать на потоки. Ниже код: #include &lt;iostream&gt; #include &lt;Windows.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru