Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 24.07.2013
Сообщений: 72
1

Распараллелить с помощью критической секции

14.08.2013, 16:25. Показов 1026. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте форумчане! Дан массив от 1..n, который сортирует числа
например: 1...4 2 1 3 3
вывод
1
2
3 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
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <stdio.h>
#include <process.h>
#include <windows.h>
using namespace std;
int j,i,k,size,n,pot,;
int * arr;
 
DWORD WINAPI Thread(PVOID pParams )
{
 
    for(i=0;i<size;i++)
    {
        arr[i]=rand()%8+1;
        printf("%4d",arr[i]);
    }
 
    cout<<endl;
 
 
    for (i=1; i<=size; i++)
    {
 
        for(j=0;j<size;j++)
        {
            if(arr[j]==i)
            {
                k++;
            }
        }
 
        for (int f=0;f<k;f++)
        {
            cout<<i<<" ";
        }
               
        cout<<endl; 
        k=0;
    }
 
 
return 0;
}
 
int main(void)
{
 
    cout<<"Vvedite razmer massiva\n";
    cin>>size;
    cout<<"Vvedite kol-vo potokov\n";
    cin>>pot;
    arr=(int*)malloc(size*sizeof(int));
 
HANDLE hThread=CreateThread(NULL,0,Thread,(PVOID)0,0,NULL);
    
    system("PAUSE");
    
    free(arr);
    return 0;
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.08.2013, 16:25
Ответы с готовыми решениями:

Проход критической секции кода
Здравствуйте, мне нужно реализовать критическую секцию кода, которую все потоки проходят строго...

Использование критической секции
CriticalSection.Enter; Inc(Acc); if Acc &lt; Accounts.Count then CurAcc := Acc else Work...

Добавление в очередь (xQueueSend) внутри критической секции
Есть задача, которая заключается в следущем: 1. Входим в критическую секцию. 2. Изменяем...

Организовать доступ к критической секции с использованием мьютекса
Для заданной группы вычислительных процессов организовать доступ к критической секции с...

8
26 / 26 / 0
Регистрация: 10.03.2010
Сообщений: 244
14.08.2013, 17:57 2
Если я правильно понял, то потоки наперебой должны пытаться выполнить итерацию сортировки. По моему это безсмысленно, т.к. итерацию будет выполнять один поток, а остальные будут "курить", пока критическая секция ни освободит защищаемый участок данных. Но если это какое-то чудаковатое задание, то нужно вызывать EnterCriticalSection перед каждой модификацией и считыванием защищаемых данных (в данном случае arr[]) и после модификации освобождать LeaveCriticalSection. Потоков можно наплодить туеву хучу и складывать хэндлы в динамический одномерный массив. Как-то так. Да и ещё не забудьте перед запуском потоков выполнить InitializeCriticalSection
0
163 / 104 / 14
Регистрация: 17.10.2012
Сообщений: 488
14.08.2013, 18:11 3
Тогда, наверное, логичнее сделать сортировку Хоара, где каждый рекурсивный (или не каждый) вызов будет выполняться в отдельном потоке
0
0 / 0 / 0
Регистрация: 24.07.2013
Сообщений: 72
14.08.2013, 21:21  [ТС] 4
eXtream, это то понятно, ну а как это сделать на практике? как сделать так чтобы юзер сам задавал число потоков? и еще, если например юзер ввел 4 потока то это означает что массив должен будет разбит на 4 части и каждый поток выполнит свою часть?
0
26 / 26 / 0
Регистрация: 10.03.2010
Сообщений: 244
15.08.2013, 11:34 5
Всё равно не совсем понятно, если каждый поток будет сортировать N участков массива, то у вас получиться N сортированных, несвязанных между собой, участков, которые в результате придётся пересортировывать. В этом случае критические секции вообще не нужны, т.к. участки ячеек массива между собой не пересекаются
0
0 / 0 / 0
Регистрация: 24.07.2013
Сообщений: 72
15.08.2013, 11:48  [ТС] 6
eXtream, напишите плиз как это делается в коде
0
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
15.08.2013, 15:51 7
А можно увидеть, как задание сформулировано?
0
0 / 0 / 0
Регистрация: 24.07.2013
Сообщений: 72
15.08.2013, 16:34  [ТС] 8
Praktolock, Дан массив от 1..n, который сортирует числа
например: 1...5 2 1 3 3 5
вывод
1
2
3 3
5
Собственно программа сделана, остается теперь распараллелить с помощью критической секции и чтобы пользователь сам мог задавать количество потоков в которое должна выполняться программа
0
26 / 26 / 0
Регистрация: 10.03.2010
Сообщений: 244
15.08.2013, 18:24 9
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
// ThreadSort.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
 
using namespace std;
 
unsigned __stdcall ThreadFunc(void*);
 
typedef struct ARRAYINFO{
    int *ptr; // указатель на массив
    int size; // размер массива
} *PARRAYINFO;
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
int *arr = NULL, *_arr = NULL, i = 0, j = 0, size_array = 0, _size = 0, num_threads = 0;
unsigned int err = 0;
HANDLE *threads = NULL;
PARRAYINFO ArgList = NULL;
 
    cout<<"Enter size of array: ";
    cin>>size_array;
    if(size_array < 0) return -1;
    cout<<"Enter number of threads: ";
    cin>>num_threads;
 
    arr = (int *)malloc(size_array*sizeof(int));
    if(arr == NULL){
        err = GetLastError();
        return -1;
    }
 
    threads = (HANDLE *)malloc(num_threads*sizeof(HANDLE));
    if(threads == NULL){
        err = GetLastError();
        free(arr);
        return -1;
    }
 
    for(i = 0; i < size_array; i++)
    {
        arr[i]=rand()%8+1;
        printf("%4d",arr[i]);
    }
 
    
    _size = size_array / num_threads;
    _arr = arr; 
    ArgList = (PARRAYINFO)new ARRAYINFO;
    ArgList->ptr = arr;
    ArgList->size = _size;
    i=0;
    do{ 
        threads[i] = (HANDLE)_beginthreadex(NULL, 0, &ThreadFunc, (void *)ArgList, CREATE_SUSPENDED, NULL);     
        i++;        
        if(i == num_threads-1) _size += size_array - _size*num_threads; // коректируем размер последнего массива
        _arr = (int *)((DWORD)_arr+_size);
 
        ArgList = (PARRAYINFO)new ARRAYINFO;
        ArgList->ptr = _arr;
        ArgList->size = _size;
    }while(i < num_threads);
 
    for(i = 0; i < num_threads; i++){
        ResumeThread(threads[i]);
    }
    WaitForMultipleObjects(num_threads, threads, true, INFINITE); 
    free(arr);
    free(threads);
    return 0;
}
 
unsigned __stdcall ThreadFunc(void* pArguments ){
PARRAYINFO pArrayInfo = (PARRAYINFO)pArguments;
// Здесь пишем алгоритм сортировки  
    return 0;
}
что-то вроде этого
1
15.08.2013, 18:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.08.2013, 18:24
Помогаю со студенческими работами здесь

Переделать код, чтобы вместо критической секции использовался мьютекс
Есть два потока,выводящие чётные-нечётные числа, здесь используется критическая...

Реализация критической секции при наличии только Event'a в качестве средства синхронизации
Допустим, имеется только одно средство синхронизации - Event. Помогите составить реализацию...

Как распараллелить цикл с помощью Parallel.For?
Подскажите, как данный цикл for (int i = 0; i &lt; round_segments; i++) ...

Распараллелить несколько разных процедур с помощью OpenMP
Требуется распараллелить несколько разных процедур с помощью OpenMP 3.0 в gcc 4.5. Но проблема в...


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

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