C ++ 11マルチスレッドプログラミング(その3)

 

書式#include <iostreamの>
の#include <スレッド>
の#include <文字列>
std名前空間を使用しました。

 //独自のスレッドを作成し、また、一つの関数から実行を開始する必要があります。
//無効my_print(のconst int型I、CHAR * p_myBuf)
のボイドmy_print(のconst int型I、文字列&p_myBufのconst)
{
    coutの<< "私:" << I ENDL <<;
    //アナリストは、私M1が渡される実際の値への参照ではない、と信じても、メインスレッド終了であれば、またこの変数の影響のサブスレッドを使用することである
    coutの<<「p_myBuf:」<< p_myBuf <<てendl ;
    //ポインタ際deatch子スレッド、間違いなくポインタ渡してはならないので、ここでは、問題を抱えている
    リターン;
}
int型のmain()
{
    / *
   :ゼロオブジェクトスレッドはパラメータ渡された
    長い一時的な構成Aとしてとして(2.1)クラスオブジェクトは、メインスレッドが実行完了する前に、スレッド関数のパラメータを構築できるようにする必要があり、スレッドへのパラメータとして渡された
    シンプルなパラメータのこのタイプはint型を渡した場合、勧告は値によって渡され、参照変数を使用していないメインスレッドシミュレーションの最後です原因の問題を解放します。
    クラスオブジェクトが渡された場合は、暗黙の型変換を避けるために。この行のすべては一時オブジェクトを構築するためにスレッドを作成し、選ぶために参照された関数パラメータを使用します。
    あなたは、参照を使用しない場合は、そのため複数のコールコピーコンストラクタとなります。
    (2.2)
    II:パラメータスレッドとして一時オブジェクト
    スレッドIDの概念:ID番号、各スレッド(メインスレッドまたはサブスレッドのいずれか)は、実際の数に対応しています。
    異なるスレッドIDが異なっている必要があります。
    スレッドIDは、に、C ++標準ライブラリ関数を使用することができますGETのstd:this_thread :: GET_ID();
    * /
    int型M1 = 1;
    int型&M2 = M1;
    char型のmybuf [] = "Aこれはテストです!";
    //実際にmybufを回収した(メイン完成実行)のみ、mybuf文字列になってシステムにそれほど問題があることを
    //はstd ::スレッドmy_thread4(my_print、 M1、mybuf);
    我々はそれなしに確保することができるように、オブジェクトに夜12時mybuf変換問題。
    my_thread4スレッド:: STD(my_print、M1、文字列(mybuf));
    //my_thread4.join();
    my_thread4.detach(); //子スレッドとメインスレッドが実行されている
    coutの<< << "こんにちは、世界!"てendl ;
    戻り0;
}

-------------------------------------------------- -------------------------------------------------- -------------------------

 

 

書式#include <iostreamの>
の#include <スレッド>
の#include <文字列>
std名前空間を使用しました。

クラスA
{
パブリック:
    int型M_I。
    (INT I):M_I(I)
    {
        COUT << "构造函数执行了" <<この<< "スレッドID:" <<のstd :: this_thread :: GET_ID()<< ENDL。
    }
    A(CONST A&A1):M_I(a1.m_i)
    {
        COUT << "拷贝构造函数执行" <<この<< "スレッドID:" <<のstd :: this_thread :: GET_ID()<< ENDL。
    }
    〜A()
    {
        COUT << "析构函数执行" <<この<< "スレッドID:" <<のstd :: this_thread :: GET_ID()<< ENDL。
    }
    ボイド演算子()()//不能带参数
    {
        COUT << "我的线程オペレータ执行了" << ENDL。

    }
}。

ボイドmyprint2(CONST A&pmybuf)
{
    COUT << "子线程myprint2参数地址" <<&pmybuf
        << "スレッドID:" <<のstd :: this_thread :: GET_ID()<< ENDL。
}

メインINT()
{
    / *
    (2.2)
    II:一時的なオブジェクトパラメータとしてスレッド
    のスレッドIDの概念:ID番号である、(メインスレッドまたは子スレッドかどうか)、各スレッドは、実際には数に対応します。
    異なるスレッドIDが異なっている必要があります。
    スレッドIDを取得するには、C ++標準ライブラリ関数を使用することができるのstd :: this_thread :: GET_ID();

    * /
    COUT << "メインスレッドID:" << this_thread :: GET_ID()<<てendl;
    。int型= M1 1;
    //メインスレッドを渡すために使用される一時的なオブジェクト、スレッドセーフになります。
    それが渡される//クラスオブジェクト接続の参照を使用して、メインスレッドがスレッドを作成するときには、受信一時オブジェクトコピーコンストラクタを呼び出すスレッドセーフと短い時間ですることができ、。
    スレッドmy_thread5 :: STD(myprint2、A(M1) )。

    mybufのchar [] = "これはAテストです!";
    //my_thread5.join();
    my_thread5.detach(); //子スレッドとメインスレッドで実行されている
    COUTを<< "Hello Worldの!" <<てendl;
    リターン0 ;
}

 

スレッドの関数へのパラメータとしてのスマートポインタ
空隙my_print(unique_ptrを<整数)>(端子 )// スレッド関数
{
    COUT << "my_print、" <<<< "スレッドID:" << this_thread :: :: GET_ID STD()<< ENDL。
    
}

INTメイン()
{
    unique_ptrを<整数>パイント(新しいINT(100))。
    std ::スレッドmyjob_th(my_print、STD ::移動(PINT));
    myjob_th.join();
    //myjob_th.detach()。
    
    
    0を返します。
}

 

 

公開された101元の記事 ウォン称賛73 ビュー120 000 +

おすすめ

転載: blog.csdn.net/usstmiracle/article/details/104138993