スレッドを作成する関数にオブジェクトを値渡しできないのはなぜだろうか。
その背後に論理的な理由はありますか?言語で値渡しが許可されている場合、有害でしょうか?
pthread
C スタイルのインターフェイスです。「整数を渡す」よりも柔軟性を持たせるには、ポインターでなければなりません。Avoid *
は、C で任意のものを渡すための最も柔軟な方法です。C では、もちろんstruct
値で渡すことができますが、コンパイル時にソース関数と宛先関数の両方がどの構造体を知る必要がありますか (毎回同じように、そのためstruct X
、スレッドの 1 つと別のスレッドでは使用できませんstruct Y
)。
もちろん、C++ ではクラスとテンプレートを使用して、ほぼすべての関数をほぼすべての型の関数に渡すことができます。
C++ 11std::thread
では、さまざまな C++ スタイルのものを使用して、pthread の「C らしさ」を克服できます (ターゲット システムで利用可能な実装に応じて、pthread なしでスレッドを使用できます)。
[これは に固有のものではありませんpthreads
。OS/2 と Windows の両方のスレッド実装はvoid *
、スレッド関数への引数として a を取ります]
POSIX スレッドは C API です。C はコピー コンストラクターのような言語機能を提供しないため、追加情報なしで値によってオブジェクトをコピーすることはできません (つまり、型を認識し、メモリの割り当てとデータのコピーのジョブを実行できる関数を渡します)。ただし、その API は正当な理由もなく過度に複雑になります。
そうは言っても、サイズが を超えない限り、任意のオブジェクトを値で渡すことができますsizeof(void *)
。
質問に C++ のタグを付けたので、C++ では可変引数テンプレートを介して必要な数の引数を持つ関数を渡すことができます。詳細については、を参照std::thread
してください。