Boost logo

Boost Users :

Subject: [Boost-users] [boost][thread] synchronization fails - why?
From: Alexander Heinrich (alexander.tobias.heinrich_at_[hidden])
Date: 2009-08-20 08:12:43


Hi,
I've written a small logging class which I use for debugging in a
multithreaded environment. I.e. different concurrent (boost) threads may
instantiate an object of class logmsg, which amongst other things writes
some message to the console. To synchronize the output I lock a global mutex
whenever the logmsg constructor is invoked. Unfortunately it simply doesn't
work. I still end up with output from different threads being mixed up
almost as if there was no synchronization. I write 'almost' because if I
remove the locking it's actually getting worse (crazy, huh). I added the
code for allocating the console (it's an MFC project), because I believe it
could have something to do with it, since the console itself is running in a
separate (non-boost) thread.

---
FILE* pConsole;
boost::mutex consoleMutex;
class logmsg
{
public:
  logmsg(const void* source, const char* msg, ...);
};
logmsg::logmsg(const void* source, const char* msg, ...)
{
  boost::mutex::scoped_lock lock(consoleMutex);
  if (!pConsole)
    create_console();
  cout << msg << endl;
}
void create_console()
{
  AllocConsole();
  int hConsole = _open_osfhandle(
  (long)GetStdHandle(STD_OUTPUT_HANDLE),
  _O_TEXT
  );
  pConsole = _fdopen(hConsole, "w");
  setvbuf(pConsole, NULL, _IONBF, 0); //disables buffering
  *stdout = *pConsole;
}
---
Best regards,
Alex


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