C++簡単スレッドプログラミング

Javaでのスレッドプログラミングの方法に慣れると、pthreadの関数によるマルチスレッドのプログラミングが使いづらく感じて仕方ありません。かといってスレッドプログラミングのツールを本格的に使うほどのこともないようなときに簡単にスレッドを利用できる仕組みを考えて見ました。

C++で簡単にJavaのようなスレッドプログラミングができます。

#include    <iostream>

using namespace std;

class Exception : public std::exception {
public:
  Exception(const std::string &msg)
  {
    message = msg;
  }
  virtual ~Exception() throw() {}
  const char *what() {
    return message.c_str();
  }
  std::string message;
};

class Thread {
public:
  Thread():thread(0){}
  virtual ~Thread(){}
  void start();
  void join();

protected:
  virtual void run() = 0;

private:
  static void* runThread(void *t) {
    if (t != 0) {
      ((Thread*)t)->run();
    }
    return t;
  }
  pthread_t             thread;
  pthread_attr_t        attr;
};

void
Thread::start()
{
  pthread_attr_init(&attr);
  int stat;
  if ((stat = pthread_create(&thread, &attr, Thread::runThread, this)) != 0) {
    throw Exception(strerror(stat));
  }
}
void
Thread::join()
{
  void *returnValue;
  int stat;
  if ((stat = pthread_join(thread, (void**)&returnValue)) != 0) {
    throw Exception(strerror(stat));
  }
  if (returnValue == 0) {
    throw Exception("Invalid thread");
  }
}

使う分には上記部分の動作を理解する必要はありません。Exceptionは簡易的に定義していますので、使い易いように変更した方が良いかもしれません。

使う時はJavaと同じように上記のThreadクラスを継承したクラスを定義して使います。以下は使い方のサンプルです。

class MySimpleThread : public Thread {
public:
  MySimpleThread() {}
  ~MySimpleThread() {}
  void run();
};

void
MySimpleThread::run()
{
  cerr << "thread start." << endl;
  sleep(1);
  cerr << "thread finish." << endl;
}

int
main()
{
  MySimpleThread thread;
  thread.start();
  cerr << "main." << endl;
  thread.join();
}

run()にスレッドでの処理を記述します。thread.start()でスレッドがスタートし、thread.join()でスレッドの終了を待ちます。これを実行すると

thread start.
main.
thread finish.

となります。main部分とスレッドが並列に動作していることが分かります。スレッドで利用する変数や定数などはMySimpleThreadで定義します。


リンク時には pthread のリンクを忘れないようにしてください。

複数のスレッドを生成しデータを共有するにはロックが必要になるかもしれませんが、ロックは次の機会にします。ロックがなくても結構使えると思います。

次:ロック - 排他処理