2011-09-13 8 views
0

私はスレッドエントリ機能の違いを知りたいのですが:スレッドエントリ関数と通常関数の違いは何ですか?

void* thread_function (void* parameter) 
{ 
    struct parameter * thread_data = (struct parameter *)parameter; 
    char buffer[20]; 
    int temp; 
    printf_buffer(buffer); 
} 

と正常な機能:

void printf_buffer(char *buffer) 
{ 
    printf("buffer is %s",buffer); 
    return; 
} 

私はスレッドエントリは、スレッドが作成されたときに呼び出され、どのように正常なさを知っています関数が使用されます。

実行、動作、またはインスタンスの作成に関して、スレッドエントリ関数と通常の関数との間に他に違いはありますか?

+3

「スレッド機能」と「通常機能」を定義してください。 –

+0

質問は不明です。どのような関数/ライブラリについて考えていますか? – Thilo

答えて

4

あなたが "と呼んでいるものの間に言語の違いはありませんスレッド関数 "(Justinはそれを"スレッドエントリ関数 "と呼んでいます)と、あなたが"通常の関数 "と呼んでいるものです。

スレッドのいわゆる「開始ルーチン」は、という単一のパラメータをとり、void*を返す関数ですが、同じ関数を「通常」呼び出すことを止めるものは何もありません。

スレッドの開始ルーチンが復帰すると、スレッドは実行を終了しますが、スレッド実装がそれを呼び出してスレッドを終了したためです。スタートルーチン自体と特別なことがあるわけではありません。

1

スレッド関数は、スレッドの入口/出口点に過ぎません。その関数の実行は、あなたが通常の関数として参照するものと変わりありません。

+0

ma上の例では5つのスレッドを作成しているので、各スレッド関数はバッファ内で異なる値を持ち、すべてのスレッド関数wilのprintf_bufferが正しく動作します。私はprintf_buffer ..の5つのインスタンスが存在するのですか? –

+2

@ 32:関数の「インスタンス」というものはありません。 'printf_buffer'関数は1つだけです。 'thread_function'関数は1つしかありません。自動変数は、呼び出しが同じスレッドか異なるスレッドかにかかわらず、関数の呼び出しごとに別々に作成されます。 –

+0

ああありがとうsteave jessop ..これは私が混乱していたものです –

1

man pthread_createは非常によく、それを定義しています。まだ言及されていない

http://linux.die.net/man/3/pthread_create

一つの大きな違いは、スレッドエントリは、発信者の以外のスタック上で動作することを期待すべきであるということです。このような理由のために、あなたが頻繁にあなたのスレッドが取り外されたときに、あなたの引数としてリソースのヒープコピーを渡すことになるでしょう、そしてエントリーでそれを解放:

// the caller must pass a heap copy of struct parameter* arg 
void* detached_entry(void* arg) { 

    struct parameter* parameter = (struct parameter*)arg; 
    ... 
    free(parameter); 
} 
関連する問題