Boosters,
Ok -- turns out I really didn't know what I was doing.
And I really didn't want strand at all-
I'm still fuzzy on strand.
But here's the code for what I really did want.
And the thread group is handling the Handlers properly.
Now my question is...
Why is a deadline timer the way it is?
What's it good for?
Why isn't a delay/timer like a wrapper, that you can give a function object to, and then push that into the io_service queue with a delay?
So you could do something like,
io_s.post(deadline_timer(boost::posix_time::milliseconds(100), &f));
?
- Zola
#include <iostream>
#include <boost/asio.hpp>
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/xtime.hpp>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/ref.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <vector>
namespace asio = boost::asio;
int const num_threads = 10;
std::vector<boost::thread*> tv(num_threads);
boost::mutex tv_mutex;
boost::mutex io_mutex;
class Test
{
public:
Test(asio::io_service& io_s, unsigned int n)
:
io_s(io_s),
n(n),
f(boost::bind(&Test::print, this))
{
io_s.post(f);
}
void print()
{
if (n >= 0)
{
{
boost::mutex::scoped_lock lock(io_mutex);
std::cout << "(thread=" << thread_num() << ") ";
std::cout << "Timer: " << n << std::endl;
}
{
boost::mutex::scoped_lock lock(m_mutex);
io_s.post(f);
--n;
}
boost::xtime xt;
boost::xtime_get(&xt, boost::TIME_UTC);
xt.sec += 1;
boost::thread::sleep(xt);
}
}
int thread_num()
{
boost::thread t;
for (int i=0; i<num_threads; ++i)
{
boost::mutex::scoped_lock lock(tv_mutex);
if (tv[i] && (*tv[i] == t))
{
return i;
}
}
return -1;
}
private:
asio::io_service& io_s;
unsigned int n;
boost::function<void()> f;
boost::mutex m_mutex;
};
int main()
{
asio::io_service io_s;
Test t(io_s, 1000);
boost::thread_group threads;
for (int i=0; i<num_threads; ++i)
{
boost::mutex::scoped_lock lock(tv_mutex);
tv[i] = threads.create_thread(boost::bind(&asio::io_service::run, boost::ref(io_s)));
}
threads.join_all();
}