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

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

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



RazrFalcon
Пример из инета, суть не меняет в принципе, брал здесь.
Хотя от примера не зависит в прочем.
срр
#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
Цитата(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?
однако, в этом случае компилер обязательно сообщит, что не нашёл файл. не может быть, что не скажет. так что внимательнее читай сообщения компилера.
RazrFalcon
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
А что это за переменная 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
Точно, пример с инета брал, видать кривой попался.
Скомпилило, правда boost::mutex m_mutex; так и подсвечивается :blink: , но это не влияет на компиляцию.
Всем спасибо, буду дальше разбираться.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.