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

Потоки и запоминание итераторов - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Постройте графики функций и найдите точки их пересечения. http://www.cyberforum.ru/cpp-beginners/thread517589.html
Помогите решить на C++: Постройте графики функций и найдите точки их пересечения. y=tgx, y=1;
C++ Используя программу вычисления транспонированной матрицы S^T Помогите решить задачу на С++: Используя программу вычисления транспонированной матрицы S^T, найдите для данных матриц A, B, C размерностью 3x3 значение выражения (A+B)^T-(A+C)^T+(B+C)^T. Заранее благодарен! http://www.cyberforum.ru/cpp-beginners/thread517586.html
C++ Пары в одномерном массиве
Составить программу, которая отыскивает среди пар элементов одномерного массива М те, разность между элементами которых есть величина наибольшая для данного массива. Т.е. нужно сначала найти максимум, а затем через условие проверить, если разность=максимуму, то это пара? так? Например: if (A-A=max) max=max+1 Но мне нужно что бы пары отыскивались по всему массиву, а не только со следующим...
Даны координаты двух C++
Даны координаты двух противоположных вершин прямоугольника: (x1, y1), (x2, y2). Стороны прямоугольника параллельны осям координат. Найти периметр и площадь данного прямоугольника. #include <iostream> #include<math.h> using namespace std; int main() { double x1,y1,x2,y2,P,A,sum;
C++ Параллельное вычисление факториала http://www.cyberforum.ru/cpp-beginners/thread517574.html
Необходимо реализовать последовательный и параллельный алгоритм вычисления факториала N!. Есть только последовательный расчёт. Если кто может распараллелить помогите пожалуйста. #include <stdio.h> #include <iostream> #include <sstream> #include <vector> #define base 1000000000 void writelong(std::vector<int> vec){ printf ("%d", vec.empty() ? 0 : vec.back()); for (int...
C++ размер матрицы #include <iostream> #include <vector> #include <stack> using namespace std; typedef vector<int > T_vec; typedef vector<T_vec> T_mtr; enum {EMPTY, POINT, NOTBOARD}; подробнее

Показать сообщение отдельно
Питекантроп
 Аватар для Питекантроп
246 / 140 / 6
Регистрация: 14.06.2010
Сообщений: 340
13.03.2012, 04:26     Потоки и запоминание итераторов
Цитата Сообщение от IcyWind Посмотреть сообщение
В приведённой выше программе делается предварительный шаг, чтобы получить массив вида
МЕНЬШЕ ЧИСЛА | ЧИСЛО | БОЛЬШЕ ЧИСЛА
а потом отдельно для 1 и 2 части вызвать независемые потоки. и получить отсортированный массив с помощью sort().
Йа предлагаю несколько другой принцип: Разбить ровно пополам, отсортировать, а потом слить воедино.

Смотрим код
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
#include <iostream>
#include <vector>
#include <algorithm>
 
#include "windows.h"
#include "time.h"
 
using namespace std;
 
DWORD WINAPI thr_sort_int(void * prm)
{
        vector<int>::iterator * it_p = (vector<int>::iterator*)prm;
        sort(*it_p,*(it_p + 1));
        return 0;
}
 
void sort2_int(vector<int>::iterator it1, vector<int>::iterator it2)
{
        vector<int>::iterator iter_to_sort[2];
        iter_to_sort[0] = it1;
        iter_to_sort[1] = it1 + (it2 - it1) / 2;
        HANDLE th = CreateThread(NULL, 0, thr_sort_int, &iter_to_sort, 0, NULL);
        sort(iter_to_sort[1] + 1, it2);
        WaitForSingleObject(th, 1000000);
        inplace_merge(iter_to_sort[0],iter_to_sort[1] + 1, it2);
}
 
int main()
{
        int size = 20000;
        vector<int> arr(size);
        srand(time(0));
        for (int i = 0; i < size; ++i) arr[i] = rand();
 
        sort2_int(arr.begin(), arr.end());
 
   //     for (vector<int>::iterator it = arr.begin(); it != arr.end(); it++)
    //            cout<<*it<<" ";
        cout<<endl<<endl;
 
        for (int i = 0; i < size; ++i) arr[i] = rand();
        int tm = clock();
        sort2_int(arr.begin(), arr.end());
        cout<<"time thr2: "<< 0.001 * (clock() - tm)<<endl;
 
        for (int i = 0; i < size; ++i) arr[i] = rand();
        tm = clock();
        sort(arr.begin(), arr.end());
        cout<<"time thr1: "<< 0.001 * (clock() - tm)<<endl;
    return 0;
}
У меня выигрыш от двух потоков получается где-то с 15К
 
Текущее время: 19:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru