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

Vector и thread-safe - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как изменить в реестре стартовую страницу Internet Explorer? http://www.cyberforum.ru/cpp-beginners/thread1495049.html
Подскажите пожалуйста как можно с помощью с++ в реестре изменить стартовую страницу Internet Explorer Я написал программу int main(){ HKEY key; PBYTE pbBuff; DWORD cBuff=0; DWORD Type=0; int a = RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Internet Explorer\\Main\0"),0,KEY_ALL_ACCESS, &key); RegQueryValueEx(key,TEXT("Start Page"),NULL,NULL,NULL,&cBuff); pbBuff=new...
C++ Условие работает неправильно string getNumberEmployeeEtype(string x, int temp){ /*первым аргументом является строка должности сотрудника, вторым - номер сотрудника*/ cout << "\nВыберите должность сотрудника №" << temp << " (laborer,secretary,manager,accountant,executive,researcher;): "; cin >> x; while ((x != "laborer") || (x != "secretary") || (x != "manager") || (x != "accountant") || (x != "executive") || (x !=... http://www.cyberforum.ru/cpp-beginners/thread1495043.html
Взаимодействие С++ с другими языками C++
Доброго времени суток. Возник такой вопрос, можно ли написать код например для работы с OLE, скажем на Java, и использовать этот код в языке С++, ну может быть DLL или еще как нибудь. Вопрос довольно абстрактный, но все же как С++ может взаимодействовать с другими языками?
Вычислить период колебаний контура по формуле Томпсона C++
Друзья , прошу пожалуйста помочь с написанием кода. нужно произвести расчет по данной формуле T=2pi*√LC (формула для расчета периода эл.тока) L и C задается пользователем.размерность может быть разной , но должна преобразовываться к системе Си. pi=3.14159
C++ Segmentation fault при наследовании класса http://www.cyberforum.ru/cpp-beginners/thread1494981.html
Доброго времени суток! Имею класс Initialise и класс Environment. В первом создаются экземпляры движка и прочие сопутствующие вещи. Потом эти указатели используются в других классах. Соответственно, для их использования в других классах я должен унаследовать Environment от Initialise. Однако, если я это делаю и использую уже другие самостоятельные указатели, то выходит ошибка сегментации...
C++ Ориентированное программирование в С++ Р. Лафоре Доброго времени суток форумчане! Хочу вот закинуть себе книгу "Объектно-ориентированное программирование в С++" на Ipad, да вот только не могу найти эту книгу в формате epub, может у кого-то, что-то найдеться ? Буду безмерно благодарен!!! :drink: подробнее

Показать сообщение отдельно
Ko
-65 / 5 / 0
Регистрация: 23.12.2011
Сообщений: 246
09.07.2015, 02:02  [ТС]     Vector и thread-safe
есть в queue метод emplace что это такое? как его реализовать? я почитал что вставляет вверх в очередь а в чём тонкость момента?

Добавлено через 30 минут
короче получилось за 1 час написать вот такое творение, пожалуйста подскажите что там надо дописать в bool push(T &&new_value) чтоб без дубликатов получалось создавать очередь. и ещё правильно ли у меня получился сам класс, мне требуется создать очередь без повторений и чтоб была защита при параллельном использовании и чтоб класс был шаблонным.
файл проверки usemain.cpp

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
#include <iostream>
#include "threadsafe_queue.h"
 
///////////////////////////////////////////////////////////////////////
 
void prepare_data(threadsafe_queue<int>& q)
{
    while(true)
    {
        for (int i = 0; i < 5; ++i)
            q.push(i);
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}
 
void processing_data(threadsafe_queue<int>& q, int id)
{
    while(true)
    {
        std::this_thread::sleep_for(std::chrono::seconds(1));
 
        std::cout << "Thread: " << id << ", val: "  <<", size: "<< q.size() << std::endl;
    }
}
 
 
void main(void)
{
    threadsafe_queue <int> test;
 
    std::thread t_q1 (prepare_data, std::ref(test));
    std::thread t_q2 (prepare_data, std::ref(test));
    std::thread t_q3 (prepare_data, std::ref(test));
    std::thread t_q4 (prepare_data, std::ref(test));
    std::thread t_q5 (prepare_data, std::ref(test));
    std::thread t_q6 (prepare_data, std::ref(test));
    std::thread t_q7 (prepare_data, std::ref(test));
    std::thread t_q8 (prepare_data, std::ref(test));
    std::thread t1(processing_data, std::ref(test), 1);
    std::thread t2(processing_data, std::ref(test), 2);
 
    t_q1.join();
    t_q2.join();
    t_q3.join();
    t_q4.join();
    t_q5.join();
    t_q6.join();
    t_q7.join();
    t_q8.join();
 
    t1.join();
    t2.join();
 
    std::cout << "\n\nDone.\n";
 
}
вот сам класс

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
#pragma once
#include <memory>
#include <mutex>
#include <condition_variable>
#include <thread>
#include <chrono>
#include <queue>
#include <algorithm>
#include <functional>
 
template <typename T>
class threadsafe_queue
{
private:
    mutable std::mutex mut;
    std::queue<T> data;
    std::condition_variable data_cond;
    template <typename T>
    bool has_el(std::queue<T> _RES_, T &&value)
    {
        while (!_RES_.empty()) {
            if (value == _RES_.front()) return true;
            _RES_.pop();
        }
        return false;
    }
 
    template <typename T>
    bool add_unique_el(std::queue<T> &qu, T &&t)
    {
        if (has_el(qu, std::forward<T>(t)))
            return false;
        else {
            qu.push(std::forward<T>(t));
            return true;
        }
    }
public:
    threadsafe_queue() {}
    threadsafe_queue(threadsafe_queue const& other)
    {
        std::lock_guard<std::mutex> locker(other.mut);
        data = other.data;
    }
 
    size_t threadsafe_queue::size()
    {
        std::lock_guard<std::mutex> locker(mut);
        return data.size();
        data_cond.notify_one();
    }
 
    void threadsafe_queue::swap( threadsafe_queue & other )
    {
        std::lock_guard<std::mutex> locker(mut);
        std::queue<T> tmp;
        tmp = other.data;
        other = data;
        data = tmp;
        data_cond.notify_one();
    }
 
    void threadsafe_queue::push(T new_value)
    {
        std::lock_guard<std::mutex> locker(mut);
        data.push(new_value);
        data_cond.notify_one();
    }
 
/*  template <typename T>
    bool push(T &&new_value)
    {
        std::lock_guard<std::mutex> locker(mut);
        bool is_pushed = this->add_unique_el(std::forward<T>(new_value)); // тут не компилируется ошибку выдаёт
 
        if (is_pushed) data_cond.notify_one();
        return is_pushed;
    }*/
 
    std::shared_ptr<T> threadsafe_queue::front()
    {
        std::lock_guard<std::mutex> locker(mut);
        if ( !qu.empty() )
            return data.front();
        data_cond.notify_one();
    }
 
    void threadsafe_queue::back()
    {
        std::lock_guard<std::mutex> locker(mut);
        if ( !qu.empty() )
            return data.back();
        data_cond.notify_one();
    }
 
    void threadsafe_queue::emplace()
    {
        //тут что писать фиг знает)
    }
 
    bool threadsafe_queue::empty() const 
    {
        std::lock_guard<std::mutex> locker(mut);
        return data.empty();
    }
};
 
Текущее время: 07:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru