/* =============================================================================
* scpp_thread.hpp
* Copyright (c) 2003 - 2011 Nomura Kei
* LICENSE :
* LGPL (GNU Lesser General General Public License - Version 3,29 June 2007)
* http://www.gnu.org/copyleft/lesser.html
* =============================================================================
*
* スレッドモジュール
*
*/
#ifndef SCPP_THREAD_HPP
#define SCPP_THREAD_HPP
#include <scpp_os.hpp>
#include <scpp_exception.hpp>
#if (SCPP_IS_WINDOWS)
#include <process.h>
typedef HANDLE thread_t;
typedef HANDLE mutex_t;
#else
#include <pthread.h>
#include <time.h>
typedef pthread_t thread_t;
typedef pthread_mutex_t mutex_t;
#endif // SCPP_IS_WINDOWS
namespace scpp
{
/**
* スレッドを実行する全てのクラスでは, この Runnable インタフェースを
* 実装する必要があります. 本インタフェースを実装するクラスは,
* 引数のない run メソッドを実装する必要があります.
*
* 以下にコード例を示す.
* @code
* class MyRunnable : public Runnable
* {
* public:
* void run()
* {
* // スレッドで実行する内容
* }
* }
*
* int main(int argc, char* argv[])
* {
* MyRunnable r;
* Thread t(&r);
* t.start(); // <- MyRunnable の run が別スレッドで実行される
* t.join(); // <- スレッドが終了するまで待つ
* return 0;
* }
* @endcode
*/
class Runnable
{
public:
virtual void run() = 0;
};
/**
* スレッドに関するエラー発生時に throw される Exception.
*/
class ThreadException : public Exception
{
public:
ThreadException() throw();
ThreadException(const ThreadException& t) throw();
ThreadException(const std::string& msg) throw();
virtual ~ThreadException() throw();
};
/**
* スレッドクラス.
* 本クラスまたは, Runnable を継承しスレッドを作成することが可能です.
* @code
* 使用例)
*
* class SampleThread : Thread
* {
* public:
* void run()
* {
* // スレッドで動作させるコード
* }
* };
*
* SampleThread thread;
* thread.start(); // <-- スレッドを起動
* thread.join(); // <-- スレッドが終了するまで待つ
*
* @endcode
*/
class Thread : public Runnable
{
public:
Thread();
Thread(const Thread& t);
Thread(Runnable* r);
virtual ~Thread();
virtual void run();
void start();
bool isAlive();
void join();
static void sleep(long time);
protected:
virtual bool createThread();
private:
Runnable* runnable;
bool aliveState;
thread_t tid;
#if (SCPP_IS_WINDOWS)
static unsigned __stdcall executeThread(void* args);
unsigned int threadId;
#else
static void* executeThread(void* args);
#endif
};
/**
* Mutex を扱う.
*/
class Mutex
{
public:
Mutex();
virtual ~Mutex();
void lock();
void unlock();
private:
mutex_t mutex;
};
} // namespace scpp
#endif // SCPP_THREAD_HPP