[ https://issues.apache.org/jira/browse/AMQCPP-559?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Francois Godin updated AMQCPP-559: ---------------------------------- Comment: was deleted (was: Here is the file used to reproduce the problem. The URI string should be changed to correspond to a valid ActiveMq server. If the line "#define THREAD" is removed, there is no problem. The program started at 20m and finished at > 100m.) > Deadlock in concurrent condition > -------------------------------- > > Key: AMQCPP-559 > URL: https://issues.apache.org/jira/browse/AMQCPP-559 > Project: ActiveMQ C++ Client > Issue Type: Bug > Environment: CentOS release 6.4 (Final) > Reporter: eagle518 > Assignee: Timothy Bish > Attachments: repro.cpp > > > run a moment and deadlock at await(). > code: > #include <stdlib.h> > #include <stdio.h> > #include <string.h> > #include <activemq/util/Config.h> > #include <activemq/library/ActiveMQCPP.h> > #include <decaf/lang/Runtime.h> > #include <decaf/lang/Integer.h> > #include <decaf/util/ArrayList.h> > #include <decaf/lang/String.h> > #include <decaf/lang/System.h> > #include <decaf/lang/Integer.h> > #include <decaf/lang/exceptions/RuntimeException.h> > #include <decaf/util/concurrent/locks/Lock.h> > #include <decaf/util/concurrent/locks/Condition.h> > #include <decaf/util/concurrent/locks/ReentrantLock.h> > #include <decaf/util/LinkedList.h> > using namespace std; > using namespace decaf; > using namespace decaf::lang; > using namespace decaf::lang::exceptions; > using namespace decaf::util; > using namespace decaf::util::concurrent; > using namespace decaf::util::concurrent::locks; > class LockConditionTest { > public: > LockConditionTest(); > virtual ~LockConditionTest(); > void put(); > String* take(); > private: > Condition* fullCondition; > Condition* emptyCondition; > decaf::util::concurrent::locks::Lock* lock; > int maxSize; > LinkedList<String*> *bag; > }; > class Producer: public Runnable { > public: > Producer(LockConditionTest *test) { > m_parent = test; > } > virtual ~Producer() { > } > void run() { > try { > do { > m_parent->put(); > } while (1); > } catch (Exception& e) { > e.printStackTrace(); > throw e; > } > } > private: > LockConditionTest *m_parent; > }; > class Customer: public Runnable { > public: > Customer(LockConditionTest *test) { > m_parent = test; > } > virtual ~Customer() { > } > void run() { > do { > String* s = m_parent->take(); > delete s; > } while (1); > } > private: > LockConditionTest *m_parent; > }; > LockConditionTest::LockConditionTest() { > lock = new ReentrantLock(); > fullCondition = lock->newCondition(); > emptyCondition = lock->newCondition(); > maxSize = 10; > bag = new LinkedList<String*>(); > } > LockConditionTest::~LockConditionTest() { > delete bag; > delete fullCondition; > delete emptyCondition; > delete lock; > } > void LockConditionTest::put() { > int n = 0; > lock->lock(); > try { > while (bag->size() >= maxSize) > fullCondition->await(); > bag->push(new String(Integer::toString(n++))); > printf("push: %d\n", bag->size()); > emptyCondition->signal(); > } catch (Exception& ex) { > ex.printStackTrace(); > } > lock->unlock(); > } > String* LockConditionTest::take() { > String* result = NULL; > lock->lock(); > try { > while (bag->size() == 0) > emptyCondition->await(); > result = dynamic_cast<String*>(bag->pop()); > printf("pop: %d\n", bag->size()); > fullCondition->signal(); > } catch (Exception& e) { > e.printStackTrace(); > } > lock->unlock(); > return result; > } > static void test_condition() > { > ArrayList<Thread*> arr; > ArrayList<Runnable*> arr1; > LockConditionTest *tct = new LockConditionTest(); > Runnable *r1 = new Producer(tct); > Thread *t1 = new Thread(r1); > t1->start(); > arr.add(t1); > arr1.add(r1); > Runnable *c1 = new Customer(tct); > Thread *t2 = new Thread(c1); > t2->start(); > arr.add(t2); > arr1.add(c1); > Runnable *r2 = new Producer(tct); > Thread *t3 = new Thread(r2); > t3->start(); > arr.add(t3); > arr1.add(r2); > Runnable *c2 = new Customer(tct); > Thread *t4 = new Thread(c2); > t4->start(); > arr.add(t4); > arr1.add(c2); > Runnable *r3 = new Producer(tct); > Thread *t5 = new Thread(r3); > t5->start(); > arr.add(t5); > arr1.add(r3); > Runnable *c3 = new Customer(tct); > Thread *t6 = new Thread(c3); > t6->start(); > arr.add(t1); > arr1.add(c3); > for (int i = 0; i < arr.size(); i++) { > arr.get(i)->join(); > } > delete tct; > printf("end of test_condition.\n"); > } > int main(int argc, const char** argv) > { > activemq::library::ActiveMQCPP::initializeLibrary(); > test_condition(); > return 0; > } -- This message was sent by Atlassian JIRA (v6.3.4#6332)