Я пытаюсь понять, как использовать новый поток std :: thread с помощью Visual Studio 2012. Я пытаюсь скомпилировать следующий код.
#include <iostream>
#include <thread>
class scoped_thread
{
std::thread t_;
public:
explicit scoped_thread(std::thread & t): t_(std::move(t))
{
if(!t_.joinable())throw std::logic_error("No thread");
}
~scoped_thread()
{
t_.join();
}
private:
scoped_thread(scoped_thread const &);
scoped_thread & operator=(scoped_thread const &);
};
struct local_functor
{
int& i_;
local_functor(int & i):i_(i){}
void operator()()
{
while(i_ < 1e5)i_++;
}
};
// can potentially throw exceptions
void callAnotherFunc()
{
std::cout << "this function can throw an exception" << std::endl;
// try (un)commenting the line below and see the behaviour
throw std::out_of_range("WTF2");
}int main()
{
int some_local_state = 0;
try
{
scoped_thread t(std::thread(local_functor(some_local_state)));
callAnotherFunc();
std::cout << "Proper exit of function" << std::endl;
}
catch(const std::exception & e)
{
std::cout << e.what() << " exception occurred!" << std::endl;
}
catch(...)
{
std::cout << "Unhandled exception!" << std::endl;
}
return 0;
}
Я получаю предупреждение, которое говорит
предупреждение C4930: ‘scoped_thread t (std :: thread (__cdecl *) (local_functor))’: не вызвана прототипная функция (было ли предназначено определение переменной?)
Да, это было определение переменной, которая была предназначена. Как я должен это сделать?
Предупреждение говорит вам, что первая строка в вашем блоке try анализируется как объявление функции. Это иногда радует, если вы используете стиль инициализации C ++ 03. Вместо этого используйте равномерную инициализацию:
scoped_thread t{std::thread{local_functor{some_local_state}}};
Кроме того, у вас отсутствует &
в конструкторе scoped_thread:
explicit scoped_thread(std::thread && t): t_(std::move(t))
// ^-- use r-value ref
PS:
Если ваш компилятор не поддерживает одинаковую инициализацию, заключите инициализатор в другую пару скобок: scoped_thread t((std::thread(local_functor(some_local_state))));
Вы наткнулись на самый неприятный разбор.
Вы можете решить это с помощью равномерная инициализация синтаксис:
scoped_thread t{std::thread(local_functor(some_local_state))};