Boost logo

Boost Users :

Subject: [Boost-users] [asio] multi-threaded io_service::run produce wrong result
From: leiming (lmforreg_at_[hidden])
Date: 2011-03-28 08:40:02


Hi, there.

At first, sorry for my poor English.
I'm a newbie to boost and nowadays I'm trying understand how to use
boost::asio in multi-thread environment.
I have written a program as below:
(I do know it's of no use, I wrote it just for learning)

------------------------------------------------------------
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <boost/bind.hpp>
#include <iostream>

using std::cout;
using std::endl;
using namespace boost;
using namespace boost::asio;

io_service ioserv;
mutex m;
volatile int c = 0;

void add() {
     lock_guard<mutex> g(m);
     ++c;
}

int main() {
     thread t1(bind(&io_service::run, ref(ioserv)));
     thread t2(bind(&io_service::run, ref(ioserv)));
     for(int i = 0; i < 655360; ++i)
         ioserv.post(&add);
     t1.join();
     t2.join();
     cout << c << endl;
     return 0;
}
------------------------------------------------------------

the expected output is 655360. but in fact, nearly everytime when I
ran it it gave me a different result ranged from 1 to 655360.

I have checked my code, it locks the variable "c" before changing it.
and I did join the two threads before I printed the value of "c".

If I put the "post loop" before any thread that runs io_service::run
starts, it prints 655360 but it's not what I want to add all task
before thread starts.

I have tried to compile the code with msvc7.1/boost 1.43,
msvc9/boost 1.43 and msvc10/boost 1.46, the result is the same.

I could find that only one thread works most of the time via process
explorer.

I thought that it's because t1 and t2 ended while the main thread was
posting "add". Then I tried adding "ioserv.run();" before "t1.join();"
but it didn't work.

And then, if I didn't use t1 and t2, only run "ioserv.run();" after
the "for" loop, the result became 655360.

What I guessed is that, t1 and t2 ended when the main thread continues
to post task to t1 and t2, then these task were lost.
Just guessing, the source code of asio is currently hard for me...

Is there anything wrong in my program?
Hope someone could help me.
thanks in advance.

the compile and run environment is:
1 core cpu, windows xp pro, boost 1.43, msvc 7.1
1 core cpu, windows xp pro, boost 1.43, msvc 9
2 cores cpu, windows 7 pro, boost 1.46, msvc 10

regards,
Leiming


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