1

PthreadLinuxでライブラリを使用してスレッドを作成する場合、必要なpthread_create引数の1つとして関数を使用する必要がありますvoid *。これにより、何かへのポインターを渡すことができ、スレッドルーチンがそれにアクセスできるようになりますが、次のようなことをしても安全です。これ

{//some scope
    int a=5//scope variable
    pthread_create(&id,NULL,some_function,(void*)a);
}//end of scope

そして私のルーチンでは:

void *some_function(void *_arg)
{
    int a=(int)arg;
    return NULL;
}

このようなことをしたいので、変数の値をスタックに保持して、スレッドルーチンからアクセスできるようにしますが、単一変数の構造体を作成したり、手動でメモリを割り当てたりしたくありません。

このようなスレッドをいくつか作成するので、このような状況でリストや動的配列を使用せずに済ませることができるかどうかを知りたいと思いました。

4

2 に答える 2

4

あなたがしていることは、現実の世界では完全に安全です。未定義の動作と未定義の動作の間の変換intvoid *それは実装定義であり、すべての実装は自然で正しい方法でそれを定義します。これは、単一整数の引数を新しいスレッドに渡す唯一の効率的な方法でもあります。他のアプローチはすべて、明示的なロックを介して、またはmalloc元のスレッドと新しいスレッド( /実装freeに暗黙の同期コストが隠されている)で使用することにより、コストのかかる同期を必要とします。mallocfree

ただし、一部のコンパイラは変換に対して警告を発行することに気付くでしょう。これは、 ;intの値の全範囲を表すことができると想定している古い壊れたコードが原因です。コンパイラーは、をに格納する(有効な)プラクティスと、をに格納する(無効な)プラクティスvoid *を区別できません。解決策として、警告の代わりにを使用することをお勧めします。これにより、警告が回避されます。元の変数がである場合、中間キャストスルーを追加するだけで警告を回避できます。intvoid *void *intintptr_tintintintptr_t

于 2012-06-03T15:26:33.950 に答える
1

この場合、のサイズは整数の値をサポートするのに十分な大きさであるため、 arga引数を介しての値をsome_functionスタックにプッシュしても安全です。void*

于 2012-06-03T15:26:46.313 に答える