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

Синхронизация потоков

23.11.2017, 18:49. Показов 1673. Ответов 25
Метки нет (Все метки)

Снова привет. Есть у меня код, который требуется раскидать на потоки. Ниже код:
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
#include <iostream>
#include <Windows.h>
using namespace std;
 
void main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    int a = 0;
    int b = 0;
    int c = 0;
    int summ = 0;
    int value = 0;
    int answer = 0;
    int variant = 0;
 
    cout << "Синхронизация потоков" << endl;
    cout << "Введите номер потока(1 - тест, 2 - задание): -> ";
    cin >> answer;
 
    switch (answer)
    {
    case 1:
    {
        cout << endl;
        a = 1;
        b = 3;
        c = 2;
        cout << "==========================================================================" << endl;
        cout << "Выбран тестовый вариант из задания, значения будут введены автоматически!!" << endl;
        cout << "Вариант: -> 0; Первое число: -> 1; Второе число: -> 3; Третье число: -> 2;" << endl;
        cout << "==========================================================================" << endl;
        cout << endl;
 
        cout << "===========================================================" << endl;
 
        for (int i = 1; i < 3; i++)
        {
            summ = value;
            if (value != 0)
            {
                a = summ;
                summ = 0;
            }
            for (int j = 0; j < 5; j++)
            {
                summ += a;
            }
            value = summ * b;
            cout << "Текущая итерация: -> " << i << endl;
            cout << "Текущее значение общей переменной: -> " << value << endl;
        }
 
        cout << "===========================================================" << endl;
        cout << endl;
        cout << "Окончательный результат программы: -> " << value << endl;
        cout << endl;
        break;
    }
    case 2:
    {
        cout << "Выбран вариант с заданием. Введите ваш вариант: -> ";
        cin >> variant;
        cout << "Введите первое число: -> ";
        cin >> a;
        cout << "Введите второе число: -> ";
        cin >> b;
        cout << "Введите третье число: -> ";
        cin >> c;
 
        cout << "=================================================================================================================" << endl;
        cout << "Информация по заданию: Ваш вариант: -> " << variant << " Ваше первое число: -> " << a << " Ваше второе число: -> " << b << " Ваше третье число: -> " << c << endl;
        cout << "=================================================================================================================" << endl;
        cout << endl;
 
        cout << "===========================================================" << endl;
 
        for (int i = 1; i < c + 1; i++)
        {
            summ = value;
            if (value != 0)
            {
                a = summ;
                summ = 0;
            }
            for (int j = 0; j < 5; j++)
            {
                summ += a;
            }
            value = summ * b;
            cout << "Текущая итерация: -> " << i << endl;
            cout << "Текущее значение общей переменной: -> " << value << endl;
        }
 
        cout << "===========================================================" << endl;
        cout << endl;
        cout << "Окончательный результат программы: -> " << value << endl;
        cout << endl;
        break;
    }
 
    default:
        cout << "Не правильный выбор! Осуществите выбор из списка!" << endl;
    }
}
есть пример из задания:
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
#include <windows.h>
 
#include <stdio.h>
 
HANDLE hSem;
 
int a,b,i;
 
num = 0;
 
HANDLE hThr;
 
unsigned long uThrID;
 
void Thread( void* pParams )
 
{
 
while (1)
 
{
 
WaitForSingleObject( hSem, INFINITE );
 
for (c=0; c<i; c++) a[i] = 5 * a;
 
ReleaseSemaphore( hSem, 1, NULL );
 
}
 
}
 
int main( void )
 
{
 
hSem=CreateSemaphore( NULL, 1, 1, "MySemaphore1" );
 
hThr=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread,NULL,0,&uThrID);
 
while(1)
 
{
 
WaitForSingleObject( hSem, INFINITE );
 
printf("%d %d %d %d %d\n", num*b);
 
ReleaseSemaphore( hSem, 1, NULL );
 
}
 
return 0;
 
}
а теперь вопрос. Как это совместить, если код как в примере должен выполнять программу, которая выше. Подскажите пожалуйста
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.11.2017, 18:49
Ответы с готовыми решениями:

Синхронизация потоков - C++
Что это? Как это исправить? &quot;ConsoleApplication2.exe&quot; (Win32). Загружено...

синхронизация потоков
проблема в следующем: есть 2 потока один считает некоторую сумму в цикле по столбцам матрицы...

Синхронизация потоков
Есть статический класс к которому я хочу обращаться из разных потоков static class MyLog {...

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

25
7167 / 6142 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
23.11.2017, 20:10 2
Ты сначала определись, зачем тебе вообще потоки здесь. Что они должны делать-то?
0
0 / 0 / 1
Регистрация: 30.08.2016
Сообщений: 58
23.11.2017, 20:54  [ТС] 3
По заданию так надо, чтобы и вывод тестового примера и вывод действий по заданию выполнялись в отдельных потоках
0
7167 / 6142 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
23.11.2017, 21:03 4
Именно вывод? А семафор здесь зачем?
0
0 / 0 / 1
Регистрация: 30.08.2016
Сообщений: 58
23.11.2017, 21:23  [ТС] 5
задание так выглядит: выберете способ(семафоры, мьютекс, события) и реализуйте вот такую программу. по части вывода я был не прав. нужно чтобы код ниже выполнялся в отдельном потоке:
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
 cout << endl;
        a = 1;
        b = 3;
        c = 2;
        cout << "==========================================================================" << endl;
        cout << "Выбран тестовый вариант из задания, значения будут введены автоматически!!" << endl;
        cout << "Вариант: -> 0; Первое число: -> 1; Второе число: -> 3; Третье число: -> 2;" << endl;
        cout << "==========================================================================" << endl;
        cout << endl;
 
        cout << "===========================================================" << endl;
 
        for (int i = 1; i < 3; i++)
        {
            summ = value;
            if (value != 0)
            {
                a = summ;
                summ = 0;
            }
            for (int j = 0; j < 5; j++)
            {
                summ += a;
            }
            value = summ * b;
            cout << "Текущая итерация: -> " << i << endl;
            cout << "Текущее значение общей переменной: -> " << value << endl;
        }
 
        cout << "===========================================================" << endl;
        cout << endl;
        cout << "Окончательный результат программы: -> " << value << endl;
        cout << endl;
0
7167 / 6142 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
23.11.2017, 22:02 6
Переменные сделаешь глобальными, а это вставишь в функцию.
0
0 / 0 / 1
Регистрация: 30.08.2016
Сообщений: 58
23.11.2017, 22:39  [ТС] 7
И что мне это даст?) как потоки то отдельными сделать?)

Добавлено через 14 минут
В общем раскидал на отдельные потоки(вроде бы), но теперь проблема с бесконечными циклами, как уйти от бесконечных циклов, но так чтобы программа работала?
Код ниже:
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
#include <iostream>
#include <Windows.h>
using namespace std;
 
HANDLE hSem;
HANDLE hThr;
unsigned long uThrID;
int a = 0;
int b = 0;
int c = 0;
int summ = 0;
int value = 0;
int answer = 0;
int variant = 0;
int TimeForWhile = 1;
 
void ThreadForTest(void * pParams)
{
    cout << endl;
    a = 1;
    b = 3;
    c = 2;
 
    while (1)
    {
        WaitForSingleObject(hSem, INFINITE);
        cout << "==========================================================================" << endl;
        cout << "Выбран тестовый вариант из задания, значения будут введены автоматически!!" << endl;
        cout << "Вариант: -> 0; Первое число: -> 1; Второе число: -> 3; Третье число: -> 2;" << endl;
        cout << "==========================================================================" << endl;
        cout << endl;
 
        cout << "===========================================================" << endl;
 
        for (int i = 1; i < 3; i++)
        {
            summ = value;
            if (value != 0)
            {
                a = summ;
                summ = 0;
            }
            for (int j = 0; j < 5; j++)
            {
                summ += a;
            }
            value = summ * b;
            cout << "Текущая итерация: -> " << i << endl;
            cout << "Текущее значение общей переменной: -> " << value << endl;
        }
 
        cout << "===========================================================" << endl;
        cout << endl;
        cout << "Окончательный результат программы: -> " << value << endl;
        cout << endl;
        ReleaseSemaphore(hSem, 1, NULL);
    }
}
 
void ThreadForTask(void *pParams)
{
    cout << "Выбран вариант с заданием. Введите ваш вариант: -> ";
    cin >> variant;
    cout << "Введите первое число: -> ";
    cin >> a;
    cout << "Введите второе число: -> ";
    cin >> b;
    cout << "Введите третье число: -> ";
    cin >> c;
 
    while (1)
    {
        WaitForSingleObject(hSem, INFINITE);
 
        cout << "=================================================================================================================" << endl;
        cout << "Информация по заданию: Ваш вариант: -> " << variant << " Ваше первое число: -> " << a << " Ваше второе число: -> " << b << " Ваше третье число: -> " << c << endl;
        cout << "=================================================================================================================" << endl;
        cout << endl;
 
        cout << "===========================================================" << endl;
 
        for (int i = 1; i < c + 1; i++)
        {
            summ = value;
            if (value != 0)
            {
                a = summ;
                summ = 0;
            }
            for (int j = 0; j < 5; j++)
            {
                summ += a;
            }
            value = summ * b;
            cout << "Текущая итерация: -> " << i << endl;
            cout << "Текущее значение общей переменной: -> " << value << endl;
        }
 
        cout << "===========================================================" << endl;
        cout << endl;
        cout << "Окончательный результат программы: -> " << value << endl;
        cout << endl;
        ReleaseSemaphore(hSem, 1, NULL);
    }
}
 
int main()
{   
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    cout << "Синхронизация потоков" << endl;
    cout << "Введите номер потока(1 - тест, 2 - задание): -> ";
    cin >> answer;
 
    switch (answer)
    {
        case 1:
        {
            hSem = CreateSemaphore(NULL, 1, 1, "MySemaphore1");
            hThr = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadForTest, NULL, 0, &uThrID);
            TimeForWhile = 1;
            while (1)
            {
                WaitForSingleObject(hSem, INFINITE);
                ReleaseSemaphore(hSem, 1, NULL);
                TimeForWhile = 0;
            }
            return 0;
            break;
        }
        case 2:
        {
            hSem = CreateSemaphore(NULL, 1, 1, "MySemaphore1");
            hThr = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadForTask, NULL, 0, &uThrID);
            TimeForWhile = 1;
            while (1)
            {
                WaitForSingleObject(hSem, INFINITE);
                ReleaseSemaphore(hSem, 1, NULL);
                TimeForWhile = 0;
            }
            return 0;           
            break;
        }
 
        default:
            cout << "Не правильный выбор! Осуществите выбор из списка!" << endl;
    }
    return 0;
}
0
7167 / 6142 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
23.11.2017, 23:15 8
С чего ты взял, что они бесконечными должны быть? Убери эти циклы.
0
0 / 0 / 1
Регистрация: 30.08.2016
Сообщений: 58
23.11.2017, 23:24  [ТС] 9
оно тогда не работает без циклов
0
0 / 0 / 1
Регистрация: 30.08.2016
Сообщений: 58
23.11.2017, 23:26  [ТС] 10
точнее работает, но не завершает программу как на картинке
Миниатюры
Синхронизация потоков  
0
0 / 0 / 1
Регистрация: 30.08.2016
Сообщений: 58
23.11.2017, 23:50  [ТС] 11
И это потому что есть второй бесконечный цикл. И если его убрать, то потоки не работают

Добавлено через 3 минуты
Что я не так делаю?)
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
#include <iostream>
#include <Windows.h>
using namespace std;
 
HANDLE hSem;
HANDLE hThr;
unsigned long uThrID;
int a = 0;
int b = 0;
int c = 0;
int summ = 0;
int value = 0;
int answer = 0;
int variant = 0;
bool workingFlag = true;
 
void ThreadForTest(void * pParams)
{
    cout << endl;
    a = 1;
    b = 3;
    c = 2;
 
    WaitForSingleObject(hSem, INFINITE);
    cout << "==========================================================================" << endl;
    cout << "Выбран тестовый вариант из задания, значения будут введены автоматически!!" << endl;
    cout << "Вариант: -> 0; Первое число: -> 1; Второе число: -> 3; Третье число: -> 2;" << endl;
    cout << "==========================================================================" << endl;
    cout << endl;
 
    cout << "===========================================================" << endl;
 
    for (int i = 1; i < 3; i++)
    {
        summ = value;
        if (value != 0)
        {
            a = summ;
            summ = 0;
        }
        for (int j = 0; j < 5; j++)
        {
            summ += a;
        }
        value = summ * b;
        cout << "Текущая итерация: -> " << i << endl;
        cout << "Текущее значение общей переменной: -> " << value << endl;
    }
 
    cout << "===========================================================" << endl;
    cout << endl;
    cout << "Окончательный результат программы: -> " << value << endl;
    cout << endl;
    ReleaseSemaphore(hSem, 1, NULL);
}
 
void ThreadForTask(void *pParams)
{
 
    cout << "Выбран вариант с заданием. Введите ваш вариант: -> ";
    cin >> variant;
    cout << "Введите первое число: -> ";
    cin >> a;
    cout << "Введите второе число: -> ";
    cin >> b;
    cout << "Введите третье число: -> ";
    cin >> c;
 
    WaitForSingleObject(hSem, INFINITE);
 
    cout << "=================================================================================================================" << endl;
    cout << "Информация по заданию: Ваш вариант: -> " << variant << " Ваше первое число: -> " << a << " Ваше второе число: -> " << b << " Ваше третье число: -> " << c << endl;
    cout << "=================================================================================================================" << endl;
    cout << endl;
 
    cout << "===========================================================" << endl;
 
    for (int i = 1; i < c + 1; i++)
    {
        summ = value;
        if (value != 0)
        {
            a = summ;
            summ = 0;
        }
        for (int j = 0; j < 5; j++)
        {
            summ += a;
        }
        value = summ * b;
        cout << "Текущая итерация: -> " << i << endl;
        cout << "Текущее значение общей переменной: -> " << value << endl;
    }
 
    cout << "===========================================================" << endl;
    cout << endl;
    cout << "Окончательный результат программы: -> " << value << endl;
    cout << endl;
    ReleaseSemaphore(hSem, 1, NULL);
}
 
int main()
{   
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    cout << "Синхронизация потоков" << endl;
    cout << "Введите номер потока(1 - тест, 2 - задание): -> ";
    cin >> answer;
 
    hSem = CreateSemaphore(NULL, 1, 1, "MySemaphore1");
 
    switch (answer)
    {
        case 1:
        {
            cout << endl;
            cout << "=====================================================" << endl; 
            cout << "Создание отдельного потока для работы 1-ого варианта!" << endl;
            cout << "=====================================================" << endl;
            hThr = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadForTest, NULL, 0, &uThrID);
            while (1)
            {
                WaitForSingleObject(hSem, INFINITE);
                ReleaseSemaphore(hSem, 1, NULL);
                cout << "YOLOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO......................................" << endl;
            }
            
            break;
        }
        case 2:
        {
            cout << endl;
            cout << "=====================================================" << endl;
            cout << "Создание отдельного потока для работы 2-ого варианта!" << endl;
            cout << "=====================================================" << endl;
            hThr = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadForTask, NULL, 0, &uThrID);
            while (1)
            {
                WaitForSingleObject(hSem, INFINITE);
                ReleaseSemaphore(hSem, 1, NULL);
            }           
            break;
        }
 
        default:
            cout << "Не правильный выбор! Осуществите выбор из списка!" << endl;
    }
    return 0;
}
0
7167 / 6142 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
24.11.2017, 10:55 12
Ты понимаешь, для чего семафоры нужны? Как ты его хочешь здесь применить? WaitForSingleObject() может просто ожидать завершение потока без всяких семафоров.
И зачем ты этот цикл упорно вставляешь?
0
0 / 0 / 1
Регистрация: 30.08.2016
Сообщений: 58
24.11.2017, 12:09  [ТС] 13
потому что если я его убираю, то ни чего не выполняется

Добавлено через 9 минут
в общем я в конец запутался. семафор используется для перераспределения ресурсов между потоками, по типу как семафоры на ЖД. Бесконечный цикл я не убираю(это второй бесконечный цикл) потому что если я его убираю, то ни один поток не выполняет своей задачи
0
3753 / 3073 / 850
Регистрация: 25.03.2012
Сообщений: 11,369
Записей в блоге: 1
24.11.2017, 12:14 14
LoKi_MoKi, это всё абстрактное определение семафора. А конкретно применительно к твоей программе какие "ресурсы" в ней ты видишь?

Я о разделяемых ресурсах.
Что нужно поставлять вместо слова "разделяемый ресурс", когда мы говорим о семафорах в твоей конкретно программе?
0
0 / 0 / 1
Регистрация: 30.08.2016
Сообщений: 58
24.11.2017, 12:16  [ТС] 15
Цитата пряма из задания
Функция CreateSemaphore создает объект-семафор с указанием максимально возможного начального его значения, OpenSemaphore – возвращает дескриптор существующего семафора. Захват семафора производится с помощью ожидающих функций, при этом значение семафора уменьшается на единицу, ReleaseSemaphore - освобождение семафора с увеличением его значения на указанное в параметре число.
0
3753 / 3073 / 850
Регистрация: 25.03.2012
Сообщений: 11,369
Записей в блоге: 1
24.11.2017, 12:32 16
LoKi_MoKi, так я тя не абстрактную цитату обо всём и ниочём просил кинуть, а сказать как ты её понимаешь, применительно к ТВОЕМУ заданию!

А заодно, кидай сразу своё задание целиком. Иначе разговор идёт абсолютно беспредметный.

Добавлено через 2 минуты
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Что нужно поставлять вместо слова "разделяемый ресурс", когда мы говорим о семафорах в твоей конкретно программе?
ты проигнорировал вопрос.
1
nmcf
24.11.2017, 12:47
  #17

Не по теме:

Kuzia domovenok, да там, похоже, преподавание идёт так - типа, надо использовать семафор, а смысл не прилагается.

0
0 / 0 / 1
Регистрация: 30.08.2016
Сообщений: 58
24.11.2017, 12:54  [ТС] 18
Именно. Задание звучит просто, у вас есть 3 числа. Первое число складываете циклически 5 раз, результат умножить на второе число и выполнить все это число итераций(третье число). Причем выполнение вычислений и вывод результатов выделить в отдельный поток и синхронизировать его с потоком выполняемого процесса(программы). И тупо файлик с описанием вариантов(семафоры, мьютексы, события, и т.д.) а дальше по принципу сами разбирайтесь что и как.
0
7167 / 6142 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
24.11.2017, 13:01 19
LoKi_MoKi, ну и зачем ты взял семафор? Там вариант с простым ожиданием есть?
1
3753 / 3073 / 850
Регистрация: 25.03.2012
Сообщений: 11,369
Записей в блоге: 1
24.11.2017, 13:16 20
Цитата Сообщение от LoKi_MoKi Посмотреть сообщение
Причем выполнение вычислений и вывод результатов выделить в отдельный поток и синхронизировать его с потоком выполняемого процесса(программы).
это уже что-то! Только я бы это даже читал так "выполнение вычислений в отдельный поток и вывод результатов в отдельный поток", тогда уже можно о какой-то необходимости синхронизации говорить.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2017, 13:16
Помогаю со студенческими работами здесь

Синхронизация потоков в c++
Совершенно не понятно что не так и как правильно. Задача: Отсортировать массив целых чисел....

Синхронизация потоков
Добрый день. Как синхронизировать потоки, чтобы вывод в stdout был поочередным: foo bar foo bar?...

Синхронизация потоков на семафорах
почему не работает синхронизация потоков на семафорах? при компиляции ошибка сегментирования. На...

Буферы и синхронизация потоков
Всем привет. Суть такова: есть(будет) некая софтина которая подгружает плагины(дмнамические...


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

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

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