CLX C++ Libraries - thread
Author: clown

CLX C++ Libraries
Home >> thread

# Declrations

    class thread;
    class thread_error;

# Overview

thread は，スレッドの作成，操作を行うためのクラスです． boost::thread のインターフェースをベースに，pthread および win32 thread を用いて実装を行っています．UNIX 環境（cygwin 版 gcc を含む）で thread モジュールを利用する際は，リンクオプション -lpthread を指定して下さい．

スレッドは，コンストラクタ，または start() メソッドに， 作成されたスレッドが呼び出す関数（または関数オブジェクト）を指定して作成します． 指定できる関数（または，関数オブジェクト）は以下のような形になります．

    void function();

    class functor {
    public:
        void operator()();
    };

thread は，実行中に何らかのエラーが発生した場合は，thread_error を例外として送出します．

# Sample

example_thread.cpp

    #include <iostream>
    #include "clx/thread.h"

    clx::mutex m_;

    class exfunctor {
    public:
        exfunctor() : c_('a') {}
        explicit exfunctor(char c) : c_(c) {}

        virtual ~exfunctor() {}

        void operator()() {
            for (int i = 0; i < 10; i++) {
                clx::mutex::scoped_lock lk(m_);
                for (int j = 0; j < i+5; j++) std::cout << c_ << std::flush;
                std::cout << '\n' << std::flush;
            }
        }

    private:
        char c_;
    };

    int main(int argc, char* argv[]) {
        try {
            clx::thread t1(exfunctor('A'));
            clx::thread t2(exfunctor('B'));

            t1.join();
            t2.join();
        }
        catch (clx::system_error &e) {
            std::cerr << e.what() << std::endl;
            std::exit(-1);
        }

        std::cout << std::endl;
        std::cout << "end of main thread" << std::endl;

        return 0;
    }

    Result
    AAAAA
    BBBBB
    AAAAAA
    BBBBBB
    AAAAAAA
    BBBBBBB
    AAAAAAAA
    BBBBBBBB
    AAAAAAAAA
    BBBBBBBBB
    AAAAAAAAAA
    BBBBBBBBBB
    AAAAAAAAAAA
    BBBBBBBBBBB
    AAAAAAAAAAAA
    BBBBBBBBBBBB
    AAAAAAAAAAAAA
    BBBBBBBBBBBBB
    AAAAAAAAAAAAAA
    BBBBBBBBBBBBBB

    end of main thread

# Related Types

    typedef ... handle_pointer;

# Construction and Member Functions

    thread();

    template <class Functor>
    explicit thread(Functor f, bool detached = false);

    virtual ~thread();

    template <class Functor>
    void start(Functor f, bool detached = false);

    bool joinable() const;
    void join();
    void detach();
    void sleep(double sec);

    handle_id_type get_id();

通常，作成したスレッドは join() メソッドで終了を待つ必要があります．これに対して， コンストラクタか start() メソッドの第 2 引数に true を指定した場合，または，detach() メソッドを呼んだ場合は，スレッドが終了すると自動的にリソースの開放などの終了処理が行われます．

# Related Pages

1. CLX C++ Libraries - mutex
2. CLX C++ Libraries - condition
3. CLX C++ Libraries - call_once

# References

1. Life like a clown - マルチプラットフォームなスレッドクラス
2. Boost C++ Libraries - Chapter 17. Thread
3. pthread document
4. IT戦記 - pthread でキューを作ってみる（再々挑戦、最終版）
5. Pthreadプログラミング(2) DETACHED属性の利点と問題点の解決
6. ものぐさ備忘録 - スレッドの関数一覧（pthread, win32スレッド）
7. マルチスレッドプログラミング（POSIX、Win32）
8. AMIGO FOR Win32 - 気軽にスレッド！ThreadWrapper