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

Сортировка массива с использованием <pthread.h> - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Посчитать значение уравнения http://www.cyberforum.ru/cpp-beginners/thread1034469.html
Задача: Найти Y, если Y = X1 + X2 + … + Xn, X = Z^3 - B + A^2 / tg^2Betta . Количество X вводятся пользователем программы. Для каждого X значения Z, B, А, Betta разные (вводятся пользователем программы). #include<conio.h> #include<iostream.h> #include<cmath.h> #define MAX 2
C++ Подсчитать количество простых чисел в последовательности, больших заданного числа М Всем привет)) помогите разработать программу С++! Тема: Одномерные массивы. Разработать программу на языке программирования согласно Вашему варианту. Дан массив из N целых чисел, где N<=16, каждое число в диапазоне от –32000 до 32000. Массив для каждой задачи должен задаваться в секции объявлений глобальных переменных, например: int A =... http://www.cyberforum.ru/cpp-beginners/thread1034458.html
Разработать класс «Циклический список» и методы работы с ним C++
нужно срочно написать такую штуку, брат сидит на зачете и скинул задание. Класс «Циклический список». Методы: добавление элемента в список, удаление элемента из списка, отображение всех элементов списка на дисплее. 1. Разработать обобщенный класс по заданию преподавателя. В нем реализовать методы: ввод информации о параметрах и элементах класса; вывод элементов на дисплей; методы...
Почему я не могу создавать темы в разделе фриланс->предложения фрилансеров? C++
Почему?
C++ Класс бинарных векоров http://www.cyberforum.ru/cpp-beginners/thread1034408.html
Друзья, помогите пожалуйста написать Класс бинарных векторов..
C++ После ввода с клавиатуры произвольного строки определить и вывести на экран количество латинских букв в нем После ввода с клавиатуры произвольной строки определить и вывести на экран количество латинских букв в нем. подробнее

Показать сообщение отдельно
addyzzz
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 8
09.12.2013, 16:16     Сортировка массива с использованием <pthread.h>
Доброго дня!

Кто может помочь переделать задачу. Данный вариант работает только, когда число потоков является степенью двойки. Нужно сделать, чтобы работало с любым числом потоков.

Заранее спасибо!

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
#include <iostream>
#include <pthread.h>
#include <stdlib.h>
//сортировка сдваиванием
using namespace std;
 
double *arr;
 
pthread_cond_t *condvars;
pthread_mutex_t *mutexs;
 
bool *fl;
 
//размерность массива
int N = 100;
 
//количество процессов
//int p = 15; не будет работать!
int p = 16;
 
// просто пузырьковая сортировка
void bubble(double a[],int begin, int end) {
    int temp;
    for (int i = begin; i < end; i++) {
        for(int j = i + 1; j < end; j++) {
            if (a[i] > a[j]) {
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }
}
 
void * sort_par(void * rank) {
    int rang = (int) rank;
    // волшебный индекс, для определения неактивных потоков
    int r = rang;
    // расстояние до следующего активного соседа
    int neighbor_offset = 1;
    // сколько процесов выполняют вычисления на данном шаге
    int p_count = p;
    // размер отрезка, на котором процесс выполняет работу
    int size;
    // границы внутри массива, в рамках которых процесс будет выполнять работу
    int from, to;
    while (true) {
      
        size = N / p_count;
        from = size * r;
        to = (r == (p_count - 1)) ? N : size * (r + 1);
        
        //начало критической секции
        pthread_mutex_lock(&mutexs[rang]);
        bubble(arr, from, to);
        fl[rang] = false;
        //неактивные процессы
        if (r % 2) {
            pthread_cond_signal(&condvars[rang]);
            pthread_mutex_unlock(&mutexs[rang]);
            return 0;
        }
        if (fl[rang + neighbor_offset])
            pthread_cond_wait(&condvars[rang + neighbor_offset], &mutexs[rang + neighbor_offset]);
        pthread_mutex_unlock(&mutexs[rang + neighbor_offset]);
        pthread_mutex_unlock(&mutexs[rang]);
        //конец критической секции
        
        //условие выхода из цикла
        if (p_count == 1) 
          return 0;
        
        neighbor_offset *= 2;
        r /= 2;
        p_count = (p_count / 2);
    }
    return 0;
}
 
 
int main() {
    arr = new double[N];
    condvars = new pthread_cond_t[p];
    mutexs = new pthread_mutex_t[p];
    fl = new bool[p];
    pthread_t * threads = new pthread_t[p];
    for(int i = 0; i < N; i++)
        arr[i] = (double) (100-i);
    cout << "Исходный массив:" << endl;
    for (int i = 0; i < N; i++)
        cout << arr[i] << ' ';
    for (int i = 0; i < p; i++) {
        fl[i] = true;
        if (pthread_create(threads + i, 0, sort_par, (void *) i)) {
            cerr << "Не могу создать " << i << "ый поток" << endl;
            return -1;
        }
    }
    for(int i = 0; i < p; i++) {
        if (pthread_join(threads[i], 0)) {
            cerr << "Не могу дождаться " << i << "ого потока" << endl;
            return -1;
        }
    }
    cout << endl << "Отсортированный массив:" << endl;
    for (int i = 0; i < N; i++)
        cout << arr[i] << ' ';
    delete [] arr;
    delete [] condvars;
    delete [] mutexs;
    delete [] fl;
    delete [] threads;
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 16:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru