C++ 基礎
首都大学東京 田川研究室
戻る

UNIX pthread

UNIX、そしてその互換OSのLinuxで動くスレッド発行関数です。機能はほぼwindowsのものと変わらないので、互換性を考えてこちらを利用することをお勧めしたい。のですが・・・
ライブラリの設定があるので面倒といえば面倒です。
以下、サンプルコードになります。標準出力を並列化して行います。
#include <iostream>//用いるヘッダファイルが変わります。
#include <pthread.h>
using namespace std;//std::を省略


int gtnum[4];//スレッド番号を渡すためのグローバル変数。スレッドの数だけ必要

void* threadfunc(void* p)//スレッドを受け取る関数はこの型でないといけません。
{
    //新しくできたスレッドの処理がこの関数に渡されます。
    
    //アドレスの型変換をし、スレッド番号を受け取ります。
    int* pID = (int*)p;

    //添え字演算でpID+0*4バイトが差すアドレス上のデータをint型として受け取る。
    //int型のアドレスなので、自動的に4バイトづつデータを区切ってくれる。
    int tID = pID[0];

    cout << tID << "\n";

    return 0;
}

int main()
{
    int c;
    pthread_t hthread[4];

    cin.exceptions(ios::failbit);//まずはcinの例外処理を有効にします。

    c = 0;
    while(c < 4)
    {
        //第4引数、gnumが差すアドレス + c*4バイトのアドレスを渡す。
        pthread_create(hthread + c , 0  , threadfunc , gtnum + c);
        //配列は配列名だけ書くとアドレスを示す。
        //さらにint型のアドレスとなるので、4バイトづつの区切りにしてくれる。

        //第一引数のhthread+cも同じ動作である。
        c++;
    }

    c = 0;
    while(c < 4)
    {
        pthread_join(hthread[c] , 0);
        c++;
    }
    return 0;
}
スレッドはサブルーティンのように実行される。同じサブルーティンをいくつもスレッドを受け取る関数として並列に実行してもローカル変数は共有されない。まあ当たり前なのですが。
グローバル変数も同様で、すべてのスレッドからアクセスできる。スレッドといっても実行されているのは関数なので。
Windows用ライブラリは以下リンクからダウンロードしください。リンクが無効の場合、pthread-win32で検索してみてください。
ftp://sourceware.org/pub/pthreads-win32/dll-latest/

libがライブラリ、x86が32bit用、x64が64bit用です。64bit OSをお持ちであれば迷わず64bitで作成しましょう。
includeファイルには32bit,64bitの違いはないはずです。
binの中にあるDLLは実行ファイルと一緒に持ち歩く必要があります。なくても実行できましたがメモリリークが発生しました。常に実行ファイルと同じフォルダに入れておきましょう。
ライブラリファイルはVisual Studioのプロジェクトと一緒に持ち歩くことがお勧めです。相対的なフォルダの位置が変わらなければリンカーの設定を再度する必要がありません。
リンカーのVC++ディレクトリに以下のような記述を足します。

プロジェクト->プロパティ->構成プロパティ->VC++ディレクトリ にライブラリ、ヘッダの場所を指定します。

すでに入っている文字列選択し、右横に出てくる矢印を押します。編集というメニューが出てくると思うのでクリックします。


右上のフォルダーマークをクリックするとライブラリフォルダのパスおよび、ヘッダファイルフォルダのパスを追加できます。

$(SolutionDir)folder

のように記述でき、これでプロジェクトのトップディレクトリ->folder
という意味になります。このように指定していってください。
あとリンクの設定が必要です。 プロジェクト->プロパティ->構成プロパティ->リンカー->入力->追加の依存ファイル を編集して"pthreadVC2.lib"をリンクします。