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

📄 monitormutextest.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 <MonitorMutexTest.h>#include <TestCommon.h>using namespace std;using namespace IceUtil;class MonitorMutexTestThread : public Thread{public:        MonitorMutexTestThread(Monitor<Mutex>& m) :        _monitor(m),        _tryLock(false)    {    }    virtual void run()    {        Monitor<Mutex>::TryLock tlock(_monitor);        test(!tlock.acquired());                {            Mutex::Lock lock(_tryLockMutex);            _tryLock = true;        }        _tryLockCond.signal();        Monitor<Mutex>::Lock lock(_monitor);    }    void    waitTryLock()    {        Mutex::Lock lock(_tryLockMutex);        while(!_tryLock)        {            _tryLockCond.wait(lock);        }    }private:    Monitor<Mutex>& _monitor;    bool _tryLock;    //    // Use native Condition variable here, not Monitor.    //    Cond _tryLockCond;    Mutex _tryLockMutex;};typedef Handle<MonitorMutexTestThread> MonitorMutexTestThreadPtr;class MonitorMutexTestThread2 : public Thread{public:        MonitorMutexTestThread2(Monitor<Mutex>& monitor) :        finished(false),        _monitor(monitor)    {    }    virtual void run()    {        Monitor<Mutex>::Lock lock(_monitor);        _monitor.wait();        finished = true;    }    bool finished;private:    Monitor<Mutex>& _monitor;};typedef Handle<MonitorMutexTestThread2> MonitorMutexTestThread2Ptr;static const string monitorMutexTestName("monitor<mutex>");MonitorMutexTest::MonitorMutexTest() :    TestBase(monitorMutexTestName){}voidMonitorMutexTest::run(){    Monitor<Mutex> monitor;    MonitorMutexTestThreadPtr t;    MonitorMutexTestThread2Ptr t2;    MonitorMutexTestThread2Ptr t3;    ThreadControl control;    ThreadControl control2;    {        Monitor<Mutex>::Lock lock(monitor);                try        {            Monitor<Mutex>::TryLock tlock(monitor);            test(!tlock.acquired());        }        catch(const ThreadLockedException&)        {            //            // pthread_mutex_trylock returns EDEADLK in FreeBSD's new threading implementation            // as well as in Fedora Core 5.            //        }        // TEST: Start thread, try to acquire the mutex.        t = new MonitorMutexTestThread(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 MonitorMutexTestThread2(monitor);    control = t2->start();    t3 = new MonitorMutexTestThread2(monitor);    control2 = t3->start();    // Give the thread time to start waiting.    ThreadControl::sleep(Time::seconds(1));        {        Monitor<Mutex>::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<Mutex>::Lock lock(monitor);        monitor.notify();    }    control.join();    control2.join();    // TEST: notifyAll() wakes one consumer.    t2 = new MonitorMutexTestThread2(monitor);    control = t2->start();    t3 = new MonitorMutexTestThread2(monitor);    control2 = t3->start();    // Give the threads time to start waiting.    ThreadControl::sleep(Time::seconds(1));    {        Monitor<Mutex>::Lock lock(monitor);        monitor.notifyAll();    }    control.join();    control2.join();    // TEST: timedWait    {        Monitor<Mutex>::Lock lock(monitor);        test(!monitor.timedWait(Time::milliSeconds(500)));    }}

⌨️ 快捷键说明

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