C ++ 0x: нить, gcc или моя ошибка? - PullRequest
       19

C ++ 0x: нить, gcc или моя ошибка?

8 голосов
/ 09 сентября 2011

Это GCC 4.7.0 или это я?Что я делаю не так?

Это выдает std::system_error "операция не разрешена" исключение:

struct DumbFib {
    size_t operator()(size_t n) { return fib(n); }
    static size_t fib(size_t n) {
        return n<2 ? 1 : fib(n-2)+fib(n-1);
    }
};

void sample() {
    DumbFib dumbfib;
    thread th{ dumbfib, 35 };    // <- system_error!
    th.join();
};

, пока это работает:

void work(size_t loop) {
    for(int l = loop; l>0; --l) {
        for(int i = 1000*1000; i>0; --i)
            ;
        cerr << l << "...";
    }
    cerr << endl;
}

int main() {
    //sample();
    thread t { work, 100 };     // <- fine
    t.join();
}

Разница, конечно, в следующем:

  • В нерабочем коде используется Функтор (класс с operator())
  • В рабочем коде используетсяуказатель на функцию.

Я использую функтор неправильно, где-то? Я не могу видеть, где, не так ли?Это намек на то, что gdb имеет это в своем стеке:

#7  ... in std::thread::_M_start_thread (..., __b=warning: RTTI symbol not found\
  for class 'std::_Sp_counted_ptr_inplace<std::thread::_Impl<std::\
  _Bind_simple<DumbFib()(int)> >, ..., (__gnu_cxx::_Lock_policy)2>

Примечания: Я также попытался

  • Сначала инициализировать DumbFib, передав ему переменную-членn_=35, тот же результат.
  • Передача функтору непосредственно с помощью thread th{ DumbFib, 35 }; или thread th{ DumbFib{}, 35 };

Ответы [ 2 ]

13 голосов
/ 09 сентября 2011

При компиляции кода с помощью g++ используйте параметр -pthread.

0 голосов
/ 11 июня 2013

Я также столкнулся с подобной проблемой, и благодаря Джейсону, она решила мою проблему

Точные параметры будут

g++ code.cpp -lpthread -std=c++0x

Это то, что я должен сделать на g ++ версии 4.6.3

...