⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 monitorrecmutextest.cpp

📁 ICE-3.2 一个开源的中间件
💻 CPP
字号:
// **********************************************************************//// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.//// This copy of Ice is licensed to you under the terms described in the// ICE_LICENSE file included in this distribution.//// **********************************************************************#include <IceUtil/IceUtil.h>#include <MonitorRecMutexTest.h>#include <TestCommon.h>using namespace std;using namespace IceUtil;class MonitorRecMutexTestThread : public Thread{public:        MonitorRecMutexTestThread(Monitor<RecMutex>& m) :        _monitor(m),        _tryLock(false)    {    }    virtual void run()    {                Monitor<RecMutex>::TryLock tlock(_monitor);        test(!tlock.acquired());                {            Mutex::Lock lock(_tryLockMutex);            _tryLock = true;        }        _tryLockCond.signal();        Monitor<RecMutex>::Lock lock(_monitor);    }    void    waitTryLock()    {        Mutex::Lock lock(_tryLockMutex);        while(!_tryLock)        {            _tryLockCond.wait(lock);        }    }private:    Monitor<RecMutex>& _monitor;    bool _tryLock;    //    // Use native Condition variable here, not Monitor.    //    Cond _tryLockCond;    Mutex _tryLockMutex;};typedef Handle<MonitorRecMutexTestThread> MonitorRecMutexTestThreadPtr;class MonitorRecMutexTestThread2 : public Thread, public Monitor<RecMutex>{public:        MonitorRecMutexTestThread2(Monitor<RecMutex>& monitor) :        finished(false),        _monitor(monitor)    {    }    virtual void run()    {        Monitor<RecMutex>::Lock lock(_monitor);        _monitor.wait();        finished = true;    }    bool finished;private:    Monitor<RecMutex>& _monitor;};typedef Handle<MonitorRecMutexTestThread2> MonitorRecMutexTestThread2Ptr;static const string monitorRecMutexTestName("monitor<recmutex>");MonitorRecMutexTest::MonitorRecMutexTest() :    TestBase(monitorRecMutexTestName){}voidMonitorRecMutexTest::run(){    Monitor<RecMutex> monitor;    MonitorRecMutexTestThreadPtr t;    MonitorRecMutexTestThread2Ptr t2;    MonitorRecMutexTestThread2Ptr t3;    ThreadControl control;    ThreadControl control2;    {        Monitor<RecMutex>::Lock lock(monitor);        Monitor<RecMutex>::TryLock lock2(monitor);        test(lock2.acquired());                // TEST: TryLock                Monitor<RecMutex>::TryLock tlock(monitor);        test(tlock.acquired());                // TEST: Start thread, try to acquire the mutex.        t = new MonitorRecMutexTestThread(monitor);        control = t->start();                // TEST: Wait until the tryLock has been tested.        t->waitTryLock();    }    //    // TEST: Once the mutex has been released, the thread should    // acquire the mutex and then terminate.    //    control.join();    // TEST: notify() wakes one consumer.    t2 = new MonitorRecMutexTestThread2(monitor);    control = t2->start();    t3 = new MonitorRecMutexTestThread2(monitor);    control2 = t3->start();    // Give the thread time to start waiting.    ThreadControl::sleep(Time::seconds(1));    {        Monitor<RecMutex>::Lock lock(monitor);        monitor.notify();    }    // Give one thread time to terminate    ThreadControl::sleep(Time::seconds(1));    test((t2->finished && !t3->finished) || (t3->finished && !t2->finished));    {        Monitor<RecMutex>::Lock lock(monitor);        monitor.notify();    }    control.join();    control2.join();    // TEST: notifyAll() wakes one consumer.    t2 = new MonitorRecMutexTestThread2(monitor);    control = t2->start();    t3 = new MonitorRecMutexTestThread2(monitor);    control2 = t3->start();    // Give the threads time to start waiting.    ThreadControl::sleep(Time::seconds(1));    {        Monitor<RecMutex>::Lock lock(monitor);        monitor.notifyAll();    }    control.join();    control2.join();    // TEST: timedWait    {        Monitor<RecMutex>::Lock lock(monitor);        test(!monitor.timedWait(Time::milliSeconds(500)));    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -