1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| #include <cstdlib>
#include <ctime>
#include <iostream>
#include <OpenThreads/Condition>
#include <OpenThreads/Mutex>
#include <OpenThreads/ReadWriteMutex>
#include <OpenThreads/Thread>
#include <string>
class MessageThread : public OpenThreads::Thread
{
public:
MessageThread(const std::string &message, OpenThreads::Mutex *mutex1, OpenThreads::Mutex *mutex2) : OpenThreads::Thread()
{
mMessage = message;
mMutex1 = mutex1;
mMutex2 = mutex2;
}
virtual ~MessageThread()
{
this->cancel();
}
virtual void run()
{
if (mMutex1 == NULL || mMutex2 == NULL)
return;
while (true)
{
mMutex1->lock();
std::cout << mMessage << std::endl;
OpenThreads::Thread::microSleep((rand() % 4) * 500000);
mMutex2->unlock();
}
}
protected:
std::string mMessage;
OpenThreads::Mutex *mMutex1;
OpenThreads::Mutex *mMutex2;
};
int main(int argc, char **argv)
{
srand(time(NULL));
OpenThreads::Mutex m1;
OpenThreads::Mutex m2;
MessageThread thread("Hello", &m1, &m2);
MessageThread thread2("World", &m2, &m1);
thread.start();
thread2.start();
OpenThreads::Thread::microSleep(100000000);
return 0;
} |