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

Контейнер unordered_map, содержащий потоки - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Для изменяющегося x от a до b http://www.cyberforum.ru/cpp-beginners/thread1081581.html
Помогите написать программу
C++ Создать программу, которая вычисляет значения функции заданного диапазона; необходимо организовать ввод границ интервала, значения n, шаг аргумента Создать программу, которая вычисляет значения функции заданного диапазона; необходимо организовать ввод границ интервала, значения n, шаг аргумента http://www.cyberforum.ru/cpp-beginners/thread1081579.html
C++ ifstream: как работают операторы << и >>?
Объясните, пожалуйста, языком "ребенка", как они работают? Не доходит! Не понятно, как в этом цикле иттерирует объект: ifstream fin("biblioteka.txt");//Открываем файл long in = 0; while(fin)//Не пойму, в нем счетчик или что? {
C++ аналог класса map
есть ли у кого-нибудь примеры?или намеки с чего начать?
C++ Написать программу используя функции http://www.cyberforum.ru/cpp-beginners/thread1081554.html
Используя имя массива как указатель, и применяя адресную арифметику выполнить задание: 17. Дан одномерный массив, состоящий из N целочисленных элементов. 17.1. Ввести массив с клавиатуры. 17.2. Найти максимальный отрицательный элемент. 17.3. Вычислить среднеарифметическое четных элементов массива. 17.4. Вывести ненулевые элементы на экран в обратном порядке.
C++ Посоветуйте литературу Скачал несколько книг по C++, в самом начале книги написаны темы, которые обычно изучают не на первой странице, а в середине книге. Дайте название литературы, где по порядку все идет и понятно написано ( например сначала переменные, потом условные if else, потом циклы и т.д, а не переменные потом указатели, классы и т.д) подробнее

Показать сообщение отдельно
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
26.01.2014, 01:36     Контейнер unordered_map, содержащий потоки
постановка задачи:
есть некий класс Item
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Item
{
private:
    int id;
    string text;
public:
    Item() 
    {
        text = "default";
        id = -1;
    }
    void SetText(string text) { this->text = text; }
    void SetId(int id) { this->id = id; }
    string GetText() { return text; }
    int GetId() { return id; }
    ~Item() {}
};
есть класс ItemSubSystem который имеет vector объектов Item* и unordered_map, где ключ int а значение Item*. Класс имеет два метода - один выводит список элементов вектора, другой - модифицирует элементы map. Так как что вектор что map содержат указатели на одни и те же объекты - то есть изменение значений полей элемента Item* в map приводит к изменению значений в vector.
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
class ItemSubSystem
{
private:
    vector<Item*> toDraw;
    boost::unordered_map<int, Item*> controllerMap;
    int size;
public:
    ItemSubSystem() {};
    void InitAll()
    {
        size = 10;
        for(int i = 0; i < size; i++)
        {
            Item *it = new Item();
            it->SetId(i);
            string text = "item-" + boost::lexical_cast<string>(i);
            it->SetText(text);
            toDraw.push_back(it);
            controllerMap.insert(std::make_pair(i, it));
        }
    }
    void DrawAll() {
        BOOST_FOREACH(auto i, toDraw)
        {
            cout<<";"<<i->GetText();
        }
        cout<<endl;
    }
    void ModifyAll()
    {
        for(int i = 0; i < size; i++)
        {
            Item *it = controllerMap[i];
            int t = it->GetId();
            it->SetId(++t);
            string text = "item-" + boost::lexical_cast<string>(t);
            it->SetText(text);
        }
    }
    ~ItemSubSystem() 
    {
        BOOST_FOREACH(auto i, toDraw) delete i;
        toDraw.clear();
 
        BOOST_FOREACH(auto& i, controllerMap) delete i.second;
        controllerMap.clear();
    }
};
Необходимо чтобы в одном потоке вызывался метод drawAll, который бы выводил элементы вектора, а в другом - изменялись значения в map.

изначательно я создавал потоки в функции main. я создал две функции потоков
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
void DrawThread()
{
    for(;;)
    {
        try 
        {
            boost::this_thread::sleep(boost::posix_time::milliseconds(2000));
            items->DrawAll();
        }
        catch(boost::thread_interrupted&)
        {
            cout<<"Draw thread is stopped"<<endl;
            return;
        }
    }   
};
 
void ModifyThread()
{
    for(;;)
    {
        try 
        {
            boost::this_thread::sleep(boost::posix_time::milliseconds(15000));
            items->ModifyAll();
        }
        catch(boost::thread_interrupted&)
        {
            cout<<"Modify thread is stopped"<<endl;
            return;
        }
    }
};
где items
C++
1
ItemSubSystem *items;
Все работало если создавал потоки в main и там же останавливал.

Но потом я решил создать класс, который содержал бы map, где ключ - идентификатор потока, а значение - собственно сам поток. класс должен был позволить добавлять и останавливать/удалять потоки.
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
class ItemThreadingController
{
private:
    boost::unordered_map<long int, boost::thread> controllerMap;
    long int id;
public:
    ItemThreadingController() 
    {
        id = -1;
    }
    int AddThread(void (*func)())
    {
        boost::thread t(func);
        id++;
        controllerMap.insert(std::make_pair(id, t));
        return id;
    }
    void StopThread(long int id)
    {
        controllerMap[id].interrupt();
        controllerMap[id].join();
        controllerMap.erase(id);
        cout<<"Thread "<<id<<"has stopped and erased!"<<endl;
    }
    ~ItemThreadingController() {};
};
проблема в том, что если я оставляю код без изменений - то выдаётся ошибка при сборке
Код
13	IntelliSense: #error directive: "Incompatible build options"	111
Error	1	error C2248: 'boost::thread::thread' : cannot access private member declared in class 'boost::thread'	247
но если я закомментирую строку
C++
1
2
3
4
5
6
7
int AddThread(void (*func)())
    {
        boost::thread t(func);
        id++;
        //controllerMap.insert(std::make_pair(id, t));
        return id;
    }
то собирается без ошибок.

функция main выглядит так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main(int argc, char** argv)
{
    items = new ItemSubSystem();
    items->InitAll();
 
    ItemThreadingController *threads = new ItemThreadingController();
    int t1 = threads->AddThread(DrawThread);
    int t2 = threads->AddThread(ModifyThread);
 
    boost::this_thread::sleep(boost::posix_time::milliseconds(50000));
    threads->StopThread(t1);
    threads->StopThread(t2);
 
    return 0;
}
почему возникает ошибка?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 09:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru