crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> boost::mutex
RazrFalcon
  опции профиля:
сообщение 24.10.2010, 16:31
Сообщение #1


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Начал разбираться с boost, а конкретно с boost thread.
Во многих примерах используется mutex (#include <boost/thread/mutex.hpp>)
Но во время компиляции влазит вечно ошибка error: ‘mutex’ was not declared in this scope
То есть если я набираю boost:: то в вариантах подстановки есть к примеру thread, а mutex нет. Почему?
Из-за этого немогу инициализировать переменную.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 24.10.2010, 18:35
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


RazrFalcon, ты пространство имён не забыл указать. В доках есть примеры использования.

В коде будет примерно так
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>

int main(int argc, char *argv[])
{
    boost::mutex mutex;
    ...



Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 24.10.2010, 19:51
Сообщение #3


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Пример из инета, суть не меняет в принципе, брал здесь.
Хотя от примера не зависит в прочем.
срр
#include <iostream>
#include <boost/regex.hpp>
#include <boost/bind.hpp>
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread.hpp>
#include <boost/thread/condition.hpp>
#include <boost/shared_ptr.hpp>
#include <vector>

class threaded_class
{
        private:
        volatile bool m_stoprequested;
        std::vector<int> m_fibonacci_values;
        boost::mutex m_mutex;
        boost::thread m_thread;
        int nbFibSteps;
        int fib(int num)
        {
                switch(num)
                {
                        case 0: return 0; case 1: return 1;
                        default:
                        return fib(num-2) + fib(num-1);
                };
        }

        void do_work()
        {
                int iteration = 0;
                while (!m_stoprequested &&  iteration<nbFibSteps)
                {
                        int value = fib(++iteration);
                        boost::mutex::scoped_lock l(mutex);
                        m_fibonacci_values.push_back(value);
                }
        }

        public:
        threaded_class()
        : m_stoprequested(false),
nbFibSteps(10),
        m_thread(boost::bind(&threaded_class::do_work, this)) //Note 2
        {}
        ~threaded_class()
        {
        m_stoprequested = true;
        m_thread.join(); //Note 2
}

        int get_fibonacci_value(int _idx)
        {
        boost::mutex::scoped_lock lock(m_mutex);
        return m_fibonacci_values[_idx];
        }
};

int main(int argc, char *argv[])
{
        threaded_class fibcalc;
        fibcalc.get_fibonacci_value(4);
        return 0;
}

QT Creator как IDE + Makefile
Makefile на всякий случай
CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=hello.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=hello
LDFLAGS = -L/usr/lib -l boost_regex -l boost_thread
INCLUDEPATH = -I/usr/include/boost

all: $(SOURCES) $(EXECUTABLE)
    
$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@



Через консоль тоже безрезультатно. Ubuntu 10.10 + boost 1.42 из репов.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 25.10.2010, 6:55
Сообщение #4


Профессионал
*****

Группа: Модератор
Сообщений: 1595
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(RazrFalcon @ 24.10.2010, 22:51) *
boost 1.42 из репов

зачем 1.42 bp из репов, если уже 1.44 официальный есть?
но сути это не меняет. выше было чётко указано, что надо указать ему заголовки в инклюдах.
у тебя там с путями странность:

Цитата(RazrFalcon @ 24.10.2010, 22:51) *
#include <boost/thread/mutex.hpp>
Цитата(RazrFalcon @ 24.10.2010, 22:51) *
INCLUDEPATH = -I/usr/include/boost


у тебя файлы ищутся в каталоге /usr/include/boost/boost/xxxx. ты уверен, что надо указывать /usr/include/boost, а не /usr/include?
однако, в этом случае компилер обязательно сообщит, что не нашёл файл. не может быть, что не скажет. так что внимательнее читай сообщения компилера.

Сообщение отредактировал Iron Bug - 25.10.2010, 6:58
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 25.10.2010, 13:24
Сообщение #5


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


INCLUDEPATH вообще не влияет на компиляцию.
вывод
Running build steps for project untitled...
Starting: "/usr/bin/qmake-qt4" /media/data/Additional/makefiles/untitled.pro -r -spec linux-g++ --version
QMake version 2.01a
Using Qt version 4.7.0 in /usr/lib
The process "/usr/bin/qmake-qt4" exited normally.
Starting: "/media/data/Additional/makefiles/build-wrapper.bash" Release
======== Build Started =========
g++ -c -Wall hello.cpp -o hello.o
hello.cpp: In member function ‘void threaded_class::do_work()’:
hello.cpp:32: error: ‘mutex’ was not declared in this scope
hello.cpp: In constructor ‘threaded_class::threaded_class()’:
hello.cpp:15: warning: ‘threaded_class::nbFibSteps’ will be initialized after
hello.cpp:14: warning: ‘boost::thread threaded_class::m_thread’
hello.cpp:38: warning: when initialized here
make: *** [hello.o] Error 1
======== Build Finished ========
The process "/media/data/Additional/makefiles/build-wrapper.bash" exited normally.
Error while building project untitled (target: Desktop)
When executing build step 'Make'

Если просто пустой проект создать, прописать хедеры, и в где либо написать boost::mutex m_mutex; к примеру, то скомпилится пустой проэкт, при том что без ошибок и варнингов, только подчеркнут будет boost::mutex m_mutex;, при наведении на который будет писаться: "boost::mutex is not a type name" <_<
для наглядности

PS: да, я знаю про 1.44 и ставил уже, но толку 0, поэтому откатился на эти пока.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 25.10.2010, 13:35
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


А что это за переменная mutex? В классе threaded_class таких нет, зато есть m_mutex. ;)

class threaded_class
{
        boost::mutex m_mutex;            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

        void do_work()
        {
                int iteration = 0;
                while (!m_stoprequested &&  iteration<nbFibSteps)
                {
                        int value = fib(++iteration);
                        boost::mutex::scoped_lock l(mutex);        // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                        m_fibonacci_values.push_back(value);
                }
        }

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 25.10.2010, 13:49
Сообщение #7


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Точно, пример с инета брал, видать кривой попался.
Скомпилило, правда boost::mutex m_mutex; так и подсвечивается :blink: , но это не влияет на компиляцию.
Всем спасибо, буду дальше разбираться.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 10.7.2020, 0:15