Boost logo

Boost Users :

Subject: [Boost-users] [Thread] assertion `!pthread_mutex_lock(&m)' running threaded test
From: Rush Manbert (rush_at_[hidden])
Date: 2009-04-16 19:05:29


I have this test program:

-------------------------------------------
#include <iostream>
#include <vector>

#include <boost/thread.hpp>

class TestThread
{
   size_t m_loopCount;
   int m_serverPort;
public:
   TestThread (size_t loopCount)
   : m_loopCount (loopCount > 0 ? loopCount : 1)
   , m_serverPort (9090)
   {
     return;
   }

   void operator() (void)
   {
     for (size_t loopCount = 0; loopCount < m_loopCount; ++loopCount)
     {
       // Do the same thing the socket open code does
       char port[6];
       sprintf(port, "%d", m_serverPort);

       char buf0[512];
       sprintf (buf0, "%s %zd", "Our loop cont is: " , loopCount);

       char buf1[793];
       sprintf (buf1, "Now the loop count is: %zd", loopCount);

// boost::this_thread::yield();
     }
   }
};

int main (int argc, char * argv[])
{
   unsigned int threadLoopCount = 20000;
   unsigned int threadCount = 2500;

   // Thread storage
   std::vector<boost::thread *> threadVec;

   for (size_t i = 0; i < 1; ++i)
   {
     std::cout << i << ": Spawn " << threadCount << " threads with
loop count = " << threadLoopCount << std::endl;
     for (size_t i = 0; i < threadCount; ++i)
     {
       TestThread theThread(threadLoopCount);
       threadVec.push_back (new boost::thread (theThread));
     }

     while (false) <<<-----------------------------------------This
block of code disabled
     {
       threadVec.at(0)->join();
       delete threadVec.at(0);
       threadVec.erase(threadVec.begin());
       TestThread theThread(threadLoopCount);
       threadVec.push_back (new boost::thread (theThread));
     }

     for (size_t i = 0; i < threadVec.size(); ++i)
     {
       threadVec.at(i)->join(); <<<<-----------------------------Error
location 1
       delete threadVec.at(i); <<<<-----------------------------Error
location 2
     }
     threadVec.clear();
     std::cout << "Done" << std::endl;
   }
}

-------------------------------------------
I haven't edited it to remove disabled code. Note the while(false)
which disables the block of code that was starting a new thread as
soon as one completed. What the thread code actually does is designed
to reveal a different problem. The for loop that only executes once
was a failed attempt to make the desired error happen more often.

If I run this program enough times in the Xcode debugger, I eventually
see the error:

./boost/thread/pthread/mutex.hpp:50: failed assertion `!
pthread_mutex_lock(&m)'

In the latest case, this happened at the line I have labeled as "Error
location 1", but I have also seen this at the line labeled as "Error
location 2".

I have seen other threads regarding similar errors with boost threads,
but nothing says that this was a bug that has been fixed, or that
there is something I should do to avoid the error. I'm also wondering
if I have misunderstood something about how to use the threads code.

I am running Boost 1.36.0 on OSX 10.5.6 with Xcode 3.1.2.

Does this look like pilot error, or is it a bug?

- Rush


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