0

次のようなスレッド化されたオブジェクトを実装しようとしています:

#include <pthread.h>
#include <iostream>

class Thread
{
private:
    int id;
    static void * run(void * arg)
    {
        int tid = (int)arg;
        std::cout << "Thread " << tid << " executed." <<std::endl;
        pthread_exit(NULL);
    }
public: 
    Thread(int _id);
    void start();
    int get_id();
};

public メソッドとコンストラクターの実装は次のとおりです。

#include "std_thread.h"

Thread::Thread(int _id)
{
    id = _id;
}

void Thread::start()
{
    std::cout << "Thread created." <<std::endl;
    pthread_t thread;
    int rc = pthread_create(&thread, NULL, run, (void*)id);
    if(rc) 
        std::cout << "Return code from thread is " << rc;
}

int Thread::get_id()
{
    return id;
}

そして、ここにメインがあります:

#include "std_thread.h"

int main()
{
    Thread *thd = new Thread(0);
    thd->start();

    return 0;
}

スレッド オブジェクトを作成し、その start メソッドを呼び出すと、「スレッドが作成されました」と出力されるはずです。スレッド本体を実行します-実行しません。実際には、Thread created をコンソールに出力しますが、スレッドを作成していないように見えるか、スレッドは何もしません。ちなみに、すべてが正常にコンパイルされ、実行時エラーはありません。

何か案は?

4

1 に答える 1

1

スレッドmainが実行される前に戻ります。

プログラムは、終了する前にすべてのスレッドが完了するまで待機しませんmain。終了すると、終了し、プロセスはシャットダウンされます。

ローカル変数の代わりにあなたpthread_t thread;をメンバーとして持ち、スレッドが終了するのを待つメソッドを追加します。
これは私が思いつくことができる最も簡単な例です:

void Thread::wait()
{
    pthread_join(thread, NULL);
}

int main()
{
    Thread thd(0); // There's no point in using dynamic allocation here.
    thd.start();
    thd.wait();
    return 0;
}
于 2013-04-04T12:17:11.927 に答える