Здравствуйте! Какая есть внятная литература по реальному применению C++11, конкретно интересует многопоточность и умные указатели и boost::asio. Хочется видеть конкретные примеры применения, потому как по оф. докам да на англицком очень тяжко.
Плюс оцените корректность кода. Это некий абстрактный таймер, который запускает метод другого класса через определенные интервалы времени. Но, если не ошибаюсь, на gcc под linux и на TDM-GCC под виндой все ок, но на mingw флаг остановки таймера по значению не изменялся, только при передаче его в поток через указатель. Как правильно? Спасибо!
#include <iostream>
#include <thread>
#include <functional>
#include <memory>
#include <stdint.h>
using namespace std;
//Таймер
class Timer
{
//флаг останова
bool m_flag;
//интервал в миллисекундах
uint32_t m_time;
//метод другого класса
std::function<void(void*)> m_func;
//аргумент, передаваемый в функцию
void* arg;
public:
Timer():m_time(0)
{
m_flag=false;
arg=nullptr;
};
void connect(std::function<void(void*)> f, void* _arg)
{
m_func=f;
arg=_arg;
}
void setTime(uint32_t _time)
{
m_time=_time;
}
//запуск потока
void run()
{
cout << "run() method call..." << endl;
m_flag=true;
std::thread t(*this,arg);
t.detach();
}
//остановка потока
void stop()
{
cout << "stop() method call..." << endl;
m_flag=false;
}
void operator()(void* arg)
{
while(m_flag)
{
m_func(arg);
std::this_thread::sleep_for(std::chrono::milliseconds(m_time));
}
}
};
//Некий объект, которому нужен таймер
class Object
{
//поле объекта, изменяемое в новом потоке
volatile uint32_t m_counter;
public:
Object():m_counter(0){};
//Выполняется в таймере
void operator()(void* arg)
{
int a=*(int*)arg;
cout << "arg = " << a << "; field = " << *(&m_counter) << endl;
Inc();
}
//Метод объекта, вызываемый в новом потоке
void Inc()
{
++m_counter;
}
};
int main()
{
int a=5;
Timer tm;
Object obj;
tm.setTime(100);
tm.connect(obj, &a);
tm.run();
cin.get();
tm.stop();
return 0;
}
Плюс оцените корректность кода. Это некий абстрактный таймер, который запускает метод другого класса через определенные интервалы времени. Но, если не ошибаюсь, на gcc под linux и на TDM-GCC под виндой все ок, но на mingw флаг остановки таймера по значению не изменялся, только при передаче его в поток через указатель. Как правильно? Спасибо!
#include <iostream>
#include <thread>
#include <functional>
#include <memory>
#include <stdint.h>
using namespace std;
//Таймер
class Timer
{
//флаг останова
bool m_flag;
//интервал в миллисекундах
uint32_t m_time;
//метод другого класса
std::function<void(void*)> m_func;
//аргумент, передаваемый в функцию
void* arg;
public:
Timer():m_time(0)
{
m_flag=false;
arg=nullptr;
};
void connect(std::function<void(void*)> f, void* _arg)
{
m_func=f;
arg=_arg;
}
void setTime(uint32_t _time)
{
m_time=_time;
}
//запуск потока
void run()
{
cout << "run() method call..." << endl;
m_flag=true;
std::thread t(*this,arg);
t.detach();
}
//остановка потока
void stop()
{
cout << "stop() method call..." << endl;
m_flag=false;
}
void operator()(void* arg)
{
while(m_flag)
{
m_func(arg);
std::this_thread::sleep_for(std::chrono::milliseconds(m_time));
}
}
};
//Некий объект, которому нужен таймер
class Object
{
//поле объекта, изменяемое в новом потоке
volatile uint32_t m_counter;
public:
Object():m_counter(0){};
//Выполняется в таймере
void operator()(void* arg)
{
int a=*(int*)arg;
cout << "arg = " << a << "; field = " << *(&m_counter) << endl;
Inc();
}
//Метод объекта, вызываемый в новом потоке
void Inc()
{
++m_counter;
}
};
int main()
{
int a=5;
Timer tm;
Object obj;
tm.setTime(100);
tm.connect(obj, &a);
tm.run();
cin.get();
tm.stop();
return 0;
}