[omniORB] omniThread problem

Bruce Visscher bruce.visscher at gmail.com
Thu Nov 13 13:17:43 GMT 2008


On Thu, Nov 13, 2008 at 12:07 PM, Bjørn Kristian Larsen
<bjorn.k.larsen at met.no> wrote:
>
> I got a segmentation-fault when trying to join omni_thread's to my main thread. Both when using omni_thread::join() and omni_condition::wait ...
>
> Is there anything logically wrong with my example?

Yes.

You must always lock the associated mutex before waiting on a
condition.  This is required.  Also, while it isn't required to lock
the associated mutex before signaling the condition I believe it is
recommended.  So, I think you should only have one mutex and you
should extend the scope of the lock here:

>    w_mutex->lock();
>    workingThreads --;
>    w_mutex->unlock();
>    q_working.signal();

until after you have signalled the condition.  (Which reminds me: it
is generally preferred to create instances of locking classes like
omni_mutex_lock rather than procedurally calling omni_mutex::lock and
omni_mutex::unlock.)

>
> Can i only call join() from another omni_thread?

I don't know of any restrictions on joining omni_threads from the main thread.

>
> class TestThread : public omni_thread {
> public:
>  static int workingThreads;
>
> private:
>  omni_condition& q_working;
>  int i, j, id, jd;
>  static omni_mutex * w_mutex;
>
> public:
>  TestThread(int _i, int _j, omni_condition& working) :
>    omni_thread(), q_working(working)
>  {
>    i = id = _i;
>    j = jd = _j;
>    w_mutex->lock();
>    workingThreads ++;
>    w_mutex->unlock();
>    start_undetached();
>  }
>  //virtual void run(void* arg);
>  void* run_undetached(void* ptr) {
>    while(--i > 0) {
>      j = jd;
>      while(--j > 0){
>        int k = 100000;
>        while(--k > 0){
>          double d = (k%j) + (i%j) + (i%j) + (i%j);
>        }
>      }
>      cerr << id << ":" << i << ", ";
>    }
>    cerr << "done: " << id << endl;
>    w_mutex->lock();
>    workingThreads --;
>    w_mutex->unlock();
>    q_working.signal();
>  }
> };
>
> int TestThread::workingThreads = 0;
> omni_mutex * TestThread::w_mutex = new omni_mutex();
>
> int main(int argc, char *argv[]) {
>  cerr << "starting test" << endl;
>  omni_mutex mutex;
>  omni_condition condition(&mutex);
>  {
>    TestThread t1(1,300,condition);
>    TestThread t2(3,300,condition);
>    TestThread t3(4,300,condition);
>    TestThread t4(5,300,condition);
>    TestThread t5(6,300,condition);
>    TestThread t6(7,300,condition);
>
>    while(TestThread::workingThreads != 0){
>      cerr << "Waiting for " << TestThread::workingThreads << " threads" << endl;
>      condition.wait();
>    }
>  }
>  cerr << "terminating test" << endl;
>  return 0;
> }
>
> _______________________________________________
> omniORB-list mailing list
> omniORB-list at omniorb-support.com
> http://www.omniorb-support.com/mailman/listinfo/omniorb-list

Bruce Visscher



More information about the omniORB-list mailing list