Форум программистов, компьютерный форум 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}; подробнее

Показать сообщение отдельно
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
13.03.2012, 19:03  [ТС]     Потоки и запоминание итераторов
Да, мой вариант был продиктован как раз тем, что мне не удалось создать аналог inplace_merge.
поэтому решил сначало выбрать элемент...пусть плохо...но потом не заморачиться с ним.
Да, О(N), но если пустить 2 потока.
один из begin() второй из "midle()", понятное дело, что выигрышь будет, конечно, не в 2 раза, но довольно существенный.
Так что...пока стоит задача аналога inplace_merge в 2 потока.

Добавлено через 2 часа 16 минут
Что я делаю не так...
сортировка одним потоком ВСЕГДА быстрее, чем двумя...даже при 200 000 000 числах...
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
#include "stdafx.h"
#include <Windows.h>
#include <vector>
#include <iostream>
#include <algorithm>
#include <time.h>
using namespace std;
 
 
DWORD WINAPI func(void* param)
{
    vector<int>::iterator* p = static_cast< vector<int>::iterator* > (param);
    //cout<<endl<<"Из потока: ";
    sort(*p, *(p+1));
    //ExitThread(0);
    return 0;
}
 
 
const int N = 2000000;
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "Rus");
    srand(time(0));
    vector<int> b;
    for(int i = 0; i< N; ++i)
        b.push_back(rand());
 
    //2 potoka
    long start = clock();
    auto p_ave = b.begin();
    advance(p_ave,b.size()/2);
 
    vector<int>::iterator p[2];
    p[0] = b.begin();
    p[1] = p_ave;
    
    HANDLE potok = CreateThread(NULL, 0, func, p, 0, NULL);
    
    //WaitForMultipleObjects(2, potok, FALSE, INFINITE);
    sort(p_ave,b.end());
    WaitForSingleObject(potok, INFINITE);
    
    /*for(unsigned int i = 0; i< b.size();++i)
        cout<<b[i]<<" ";*/
 
 
    inplace_merge(b.begin(), p_ave, b.end());
 
    /*for(unsigned int i = 0; i< b.size();++i)
        cout<<b[i]<<" ";*/
    
    cout<<"Два потока. Время = "<<0.001*(clock() - start)<<"Сек"<<endl;
 
    
    for(unsigned int i = 0; i< b.size();++i)
        b[i]=rand();
    //1 potok
    start = clock();
    sort(b.begin(), b.end());
    /*for(unsigned int i = 0; i< b.size();++i)
        cout<<b[i]<<" ";*/
    cout<<"Один поток. Время = "<<0.001*(clock() - start)<<"Сек"<<endl;
    return 0;
}
Добавлено через 15 минут
Ого как! Поменял "debug" версию компиляции на "Release" и всё поменялось...очень круто поменялось...

Добавлено через 3 минуты
А кто-нибудь может это объяснить?
 
Текущее время: 00:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru