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

Vector OMP - C++

Восстановить пароль Регистрация
 
Ko
 Аватар для Ko
-65 / 5 / 0
Регистрация: 23.12.2011
Сообщений: 246
11.07.2015, 06:48     Vector OMP #1
нужно сделать класс очередь и ещё чтоб был защищенный. я использовал omp, но ошибки выскакивают. подрихтуйте пожалуйста)
вот файл в котором запускается тест

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
#include "OmpQueue.h"
#include <thread>
#include <time.h>
#include <iostream>
#include <omp.h>
 
omp_lock_t lck;
void prepare_data( OmpQueue<int> &QueueGO )
{
    auto irand(0);
    srand (time(NULL));
    for (int i(0); i < 1000; i++ )
    {
        irand = rand() % 6;
        switch (irand)
        {
        case 0: 
        {
            omp_set_lock(&lck);
            std::cout << "OmpQueue.size: " << QueueGO.size() << std::endl;
            omp_unset_lock(&lck);
            break;
        }
 
        case 1: 
        {
            QueueGO.back();
            break;
        }
 
        case 2: 
        {
            omp_set_lock(&lck);
            std::cout << "OmpQueue.empty: " << QueueGO.empty() << std::endl;
            omp_unset_lock(&lck);
            break;
        }
 
        case 3: 
        {
            omp_set_lock(&lck);
            std::cout << "OmpQueue.front: " << QueueGO.front() << std::endl;
            omp_unset_lock(&lck);
            break;
        }
 
        case 4: 
        {
            QueueGO.pop();
            break;
        }
 
        case 5: 
        {
            QueueGO.push(i);
            break;
        }
        default:
            break;
        }
    }
}
 
 
int main (void)
{
    OmpQueue<int> QueueGO;
    omp_init_lock(&lck);
 
    std::thread t( prepare_data, std::ref(QueueGO) );
 
    return true;
}
а вот файл класса

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
#pragma once
#include <vector>
#include <omp.h>
#include <algorithm>
 
template <typename T>
class OmpQueue
{
private:
    omp_lock_t LockQueue;
    std::vector < T * > Data;
    bool OmpQueue<T>::Duplication_Сheck( const T& value )
    {
        if ( std::find( Data.begin(), Data.end(), value ) != Data.end() )
            return true;
        else
            return false;
    }
public:
    OmpQueue();
    ~OmpQueue();
    std::size_t OmpQueue<T>::size()
    {
        omp_set_lock(&LockQueue);
        size_t result = Data.size();
        omp_unset_lock(&LockQueue);
        return result;
    }
    bool OmpQueue<T>::empty()
    {
        omp_set_lock(&LockQueue);
        bool result(true);
        if ( Data.size() != 0 )
        {
            result = false;
        }
        omp_unset_lock(&LockQueue);
        return result;
    }
    bool OmpQueue<T>::push( T& value )
    {
        omp_set_lock(&LockQueue);
        bool result(false);
        if ( !Duplication_Сheck (value) )
        {
            Data.push_back(value);
            result = true;
        }
        omp_unset_lock(&LockQueue);
        return result;
    }
    bool OmpQueue<T>::pop()
    {
        omp_set_lock(&LockQueue);
        bool result(false);
        if ( Data.size() != 0 )
        {
            Data.erase(Data.begin());
            result = true;
        }
        omp_unset_lock(&LockQueue);
        return result;
    }
    T & OmpQueue<T>::front()
    {
        omp_set_lock(&LockQueue);
        std::vector <T * >::iterator result;
        if ( Data.size() != 0 )
        {
            result = Data.begin();
        }
        omp_unset_lock(&LockQueue);
        return result;
    }
    T& OmpQueue<T>::back()
    {
        omp_set_lock(&LockQueue);
        T result;
        if ( Data.size() != 0 )
        {
            T result = Data.back();
        }
        omp_unset_lock(&LockQueue);
        return result;
    }
 
};
 
 
template <typename T>
OmpQueue<T>::OmpQueue()
{
    omp_init_lock(&LockQueue);
}
template <typename T>
OmpQueue<T>::~OmpQueue()
{
    omp_destroy_lock(&LockQueue);
}
короче вся проблема в методах в классе, я забыл как взять допустим первый элемент в векторе, скопировать его в безопасном месте и уже разблокировать доступ отдать обратно.

Добавлено через 2 минуты
можно было бы сделать как в предыдущей работе

C++
1
2
3
4
5
6
    const T& front() const
    {
        std::lock_guard<std::mutex> locker(mut);
        if ( !data.empty() )
            return data.front();
    }
но это не безопасно, пока я отдаю data.front() другой поток может уже его изменить или обнулить очередь, и будет еррор))

Добавлено через 33 минуты
вот чуток не дописал, а то прога заканчивает работу а поток ещё пашет

C++
1
2
3
4
5
6
7
8
9
10
int main (void)
{
    OmpQueue<int> QueueGO;
    omp_init_lock(&lck);
 
    std::thread test_omp_queue( prepare_data, std::ref(QueueGO) );
 
    test_omp_queue.join();
    return true;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2015, 06:48     Vector OMP
Посмотрите здесь:

Проблемы с распараллеливанием(omp) простой программы C++
C++ Указатель на объект вектор в векторе vector < vector<int>* >*
C++ vector<vector<double>> + std::sort()
VisualStudio C++ vector<vector<int> > push_back() C++
Расспаралеливание omp.h C++
Работа со столбцами в vector< vector<int> > C++
C++ Записать числа из файла в двумерный массив или вектор вроде такого vector<vector<int>>
C++ Не работает функция sort (vector, vector)

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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