Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Samur
0 / 0 / 0
Регистрация: 24.07.2013
Сообщений: 70
14.08.2013, 16:25     Распараллелить с помощью критической секции #1
Здравствуйте форумчане! Дан массив от 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;
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2013, 16:25     Распараллелить с помощью критической секции
Посмотрите здесь:

Можно ли это распараллелить? C++
Проход критической секции кода C++
Структуры. Вывести информацию по победителю в каждой секции и найти средний бал по каждой секции C++
Найти и вывести информацию о победителе в каждой секции. Найти средний балл каждой секции. C++
Автоматический запуск программы после критической ошибки. Как организовать? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
eXtream
24 / 24 / 0
Регистрация: 10.03.2010
Сообщений: 161
14.08.2013, 17:57     Распараллелить с помощью критической секции #2
Если я правильно понял, то потоки наперебой должны пытаться выполнить итерацию сортировки. По моему это безсмысленно, т.к. итерацию будет выполнять один поток, а остальные будут "курить", пока критическая секция ни освободит защищаемый участок данных. Но если это какое-то чудаковатое задание, то нужно вызывать EnterCriticalSection перед каждой модификацией и считыванием защищаемых данных (в данном случае arr[]) и после модификации освобождать LeaveCriticalSection. Потоков можно наплодить туеву хучу и складывать хэндлы в динамический одномерный массив. Как-то так. Да и ещё не забудьте перед запуском потоков выполнить InitializeCriticalSection
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
14.08.2013, 18:11     Распараллелить с помощью критической секции #3
Тогда, наверное, логичнее сделать сортировку Хоара, где каждый рекурсивный (или не каждый) вызов будет выполняться в отдельном потоке
Samur
0 / 0 / 0
Регистрация: 24.07.2013
Сообщений: 70
14.08.2013, 21:21  [ТС]     Распараллелить с помощью критической секции #4
eXtream, это то понятно, ну а как это сделать на практике? как сделать так чтобы юзер сам задавал число потоков? и еще, если например юзер ввел 4 потока то это означает что массив должен будет разбит на 4 части и каждый поток выполнит свою часть?
eXtream
24 / 24 / 0
Регистрация: 10.03.2010
Сообщений: 161
15.08.2013, 11:34     Распараллелить с помощью критической секции #5
Всё равно не совсем понятно, если каждый поток будет сортировать N участков массива, то у вас получиться N сортированных, несвязанных между собой, участков, которые в результате придётся пересортировывать. В этом случае критические секции вообще не нужны, т.к. участки ячеек массива между собой не пересекаются
Samur
0 / 0 / 0
Регистрация: 24.07.2013
Сообщений: 70
15.08.2013, 11:48  [ТС]     Распараллелить с помощью критической секции #6
eXtream, напишите плиз как это делается в коде
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
15.08.2013, 15:51     Распараллелить с помощью критической секции #7
А можно увидеть, как задание сформулировано?
Samur
0 / 0 / 0
Регистрация: 24.07.2013
Сообщений: 70
15.08.2013, 16:34  [ТС]     Распараллелить с помощью критической секции #8
Praktolock, Дан массив от 1..n, который сортирует числа
например: 1...5 2 1 3 3 5
вывод
1
2
3 3
5
Собственно программа сделана, остается теперь распараллелить с помощью критической секции и чтобы пользователь сам мог задавать количество потоков в которое должна выполняться программа
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2013, 18:24     Распараллелить с помощью критической секции
Еще ссылки по теме:

C++ Как отловить место критической ошибки?
Распараллелить, используя OpenMP C++
Распараллелить процессы C++

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

Или воспользуйтесь поиском по форуму:
eXtream
24 / 24 / 0
Регистрация: 10.03.2010
Сообщений: 161
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;
}
что-то вроде этого
Yandex
Объявления
15.08.2013, 18:24     Распараллелить с помощью критической секции
Ответ Создать тему
Опции темы

Текущее время: 20:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru