Example: thread.cpp application
#include <cxxtools/function.h>
#include <cxxtools/thread.h>
#include <cxxtools/mutex.h>
#include <cxxtools/condition.h>
#include <iostream>
#include <string>
#include <unistd.h>
cxxtools::Mutex coutMutex;
cxxtools::Mutex conditionMutex;
cxxtools::Condition running;
#define PRINTLN(expr) \
do { \
cxxtools::MutexLock lock(coutMutex); \
std::cout << time(0) << ' ' << expr << std::endl; \
} while (false)
class myDetachedThread : public cxxtools::DetachedThread
{
~myDetachedThread();
protected:
void run();
};
myDetachedThread::~myDetachedThread()
{
PRINTLN("myDetachedThread::~myDetachedThread() called");
}
void myDetachedThread::run()
{
PRINTLN("myDetachedThread is starting");
cxxtools::MutexLock lock(conditionMutex);
running.broadcast();
lock.unlock();
::sleep(1);
PRINTLN("myDetachedThread waits");
::sleep(2);
PRINTLN("myDetachedThread is ready");
}
void someFunction()
{
PRINTLN("someFunction()");
::sleep(1);
PRINTLN("someFunction() ends");
}
class AClass
{
std::string id;
public:
AClass(const std::string& id_)
: id(id_)
{ }
~AClass()
{ PRINTLN("AClass::~AClass of object \"" << id << '"'); }
void run()
{
PRINTLN("aFunction() of object \"" << id << '"');
::sleep(1);
PRINTLN("aFunction() of object \"" << id << "\" ends");
}
};
int main()
{
try
{
cxxtools::MutexLock lock(conditionMutex);
// detached threads are created on the heap.
// They are deleted automatically when the thread ends.
cxxtools::Thread* d = new myDetachedThread;
d->create();
running.wait(lock);
PRINTLN("myDetachedThread is running");
// run a function as a attached thread
cxxtools::AttachedThread th( cxxtools::callable(someFunction) );
th.start();
// run a method of a object as a thread
AClass aInstance("a instance");
AClass aInstance2("a instance 2");
cxxtools::AttachedThread aclassThread( cxxtools::callable(aInstance, &AClass::run) );
cxxtools::AttachedThread aclassThread2( cxxtools::callable(aInstance2, &AClass::run) );
aclassThread.start();
aclassThread2.start();
::sleep(2);
aclassThread.join();
aclassThread2.join();
// The detached thread is killed, if it does not come to an end before main.
// The attached thread blocks the main-program, until it is ready.
PRINTLN("main stops");
}
catch (const std::exception& e)
{
std::cerr << "ERROR: " << e.what() << std::endl;
}
std::cout << "main stopped" << std::endl;
}