|
Boost Users : |
Subject: [Boost-users] [asio] posting a function to an io_service object
From: Vilhelm Sundberg (vilhelmsundberg_at_[hidden])
Date: 2009-12-28 09:14:50
Hi,
I am trying to call a function by posting it to an io_service object
running in a different thread from the main thread of the application.
The problem is the function always gets called from the main thread.
Basically I would like to do this with asio:
#include <iostream>
#include <boost/thread.hpp>
using namespace std;
void f()
{
cout << boost::this_thread::get_id() << endl;
}
int main(int argc, char *argv[])
{
cout << "main thread: " << boost::this_thread::get_id() << endl;
boost::thread t1(f);
boost::thread t2(f);
t1.join();
t2.join();
return 0;
}
The output is:
main thread: 0x9739628
0x97392e8
0x9739488
Using Boost.Asio, f() always gets called from the main thread:
#include <iostream>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include <boost/asio.hpp>
using namespace std;
using namespace boost::asio;
void f()
{
cout << boost::this_thread::get_id() << endl;
}
int main(int argc, char *argv[])
{
io_service ios1;
io_service ios2;
io_service::work w1(ios1);
io_service::work w2(ios2);
io_service::strand s1(ios1);
io_service::strand s2(ios2);
boost::thread t1(boost::bind(&io_service::run, &ios1));
boost::thread t2(boost::bind(&io_service::run, &ios2));
cout << "main thread: " << boost::this_thread::get_id() << endl;
//s1.post(f);
//s2.post(f);
ios1.post(s1.wrap(f));
ios2.post(s2.wrap(f));
while (ios1.poll() > 0)
;
while (ios2.poll() > 0)
;
ios1.stop();
ios2.stop();
t1.join();
t2.join();
return 0;
}
The output is:
main thread: 0x9739628
0x9739628
0x9739628
What is the correct way of posting/dispatching a function to an
io_service running in a different thread, so that function is called
from that thread?
Thanks
Vil
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net