2011-07-28 10 views
4

私はCとpthreadsでプログラミングしています。pthread_tインスタンスを有効範囲外にすることはできますか?

void long_running_function(void * arg) { 
    ... 
} 


void start_long_running_function(void * arg) { 
    pthread_t thread; 
    pthread_create(&thread , NULL , long_running_function , arg); 
    /* What about the thread variable? */ 
} 

start_long_running_functionを(残して)ローカル変数「スレッドを」関数スコープの外に行く:私は別々のスレッドで実行したい長時間実行機能を持っています。これは問題ありませんか? long_running_function()が完了したら?

私のコードで説明したアプローチを試してみましたが、うまくいくようですが、運が幸運なのでしょうか?

よろしくヨアキム

答えて

4

はい - それは変数がスコープの外に行くように安全です。しかし、ある時点では、2つのうちの1つを実行しなければならないことを覚えておいてください。

1)pthread_detach()それで、カーネルは関連する何かのものを解放します。

2)pthread_join()は、副作用としてそれを切り離します。

あなたがそうでない場合、私はこれがリソースリークになると思います。

+0

ありがとうございます。私はpthread_detach()を調べます - 私はstart_long_running_function()の最後にそれを追加できると思います。 – user422005

+1

@ user422005:スレッドを常にデタッチすることがわかっている場合は、スレッド作成時の属性(pthread_attr_setdetachstate)を使用して、最初にdetachされたスレッドを作成できます。 –

0

これはC構造のプレーン・オールド・データなので、スコープ外に出たときに副作用を導入するデストラクタはありません。範囲を失うことの唯一の含意は、あなたがもうそれを見ることができないということです。

私はあなたがCの質問ですけど、スレッドの実装の多くは、このような何かに問題解決:あなたはCと類似した何かを行うことができます

class Thread { 
    pthread_t handle; 

    static void * start (void * self) { 
     static_cast <Thread *> (self) -> run(); 
    } 

    protected: void run() = 0; 

    public: void start() { 
     pthread_create (&handle, NULL, start, this); 
    } 

    ~ Thread() { 
     pthread_join (&handle, NULL); 
    } 
}; 

を、argmalloc EDへのポインタでありますスレッドハンドルを含むstruct。スレッド機能frees終了時。

関連する問題