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
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
#include
#include
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