2016-10-09 5 views
0

私はそのようなエラーの理由を知ります。 "int"は "void *"のバイトを保持するのに十分な大きさではありません。しかし、私の質問は、Linuxのpthread_createを処理する必要があるということです。実行するために関数の引数を渡したいときです。多くの例では、私はそのような機能前方宣言を参照してください。void *へのキャストint *が精度を失い、必要な場合の解決方法は何ですか

void* thread_proc(void* arg); 

そして機能で、ファイルポインタを(int型である)argとして渡されます。しかし、コンパイラは(論理的に)intのキャストに対して無効になることを警告するエラーをスローします。私もintptr_t(別名長いポインタ)を使用していますが、無駄です。

result = pthread_create(&thread_id, NULL, thread_proc, (void *)new_request_socket); 

new_request_socketは、ソケットのfdを表すintです。

関数の引数として整数を渡す方法は、それ自体がpthread_create()によって実行される関数として渡されます。

+2

あなたは 'pthread_create'を扱う必要はありません。単に 'std :: thread'を使うだけです。問題が解決しました。 –

+0

'int'値ではなく' int'値へのポインタを直接渡します。 – kaylum

+0

@SamVarshavchikもっと詳しく教えてもらえますか? –

答えて

1

おそらくintへのポインタではなく、int自体を渡しています。

void thread_proc(void *arg) 
{ 
    int new_request_socket = *arg; //please put appropriate cast 
} 

EDIT:ポインタthread_procを渡すことについて何サムと明度の点を明確にする:

    あなたが実際にそのように使用

    result = pthread_create(&thread_id, NULL, thread_proc, (void *)&new_request_socket); 
    

    そしてthread_proc(void *arg)にポインタを渡す必要があります

  • ローカル変数、つまりnew_request_socketへのポインタを渡さないでください。 thread_procはそれを読みnew_request_socketまで
  • いけない自由なロックを使用して合理化する必要がありますnew_request_socketにmalloc関数に
  • 同時アクセスを使用してヒープに割り当てられました。

基本的にnew_request_socketをコードに書き込む必要があります。だからもっとコードを書いて使用しないでくださいstd::thread :)

+0

これ以上変更を加えない限り、これは安全ではありません。 –

+0

このアプローチの問題は、new_request_socketが新しいスレッドが読むまでスコープ内に留まる必要があることです。 –

+0

@LightnessRacesinOrbitはい、それはポインタを受け入れる 'pthread_create'の制限だから、あなたのプログラムはそれらのケースを扱うように設計されなければなりません。 – PnotNP

関連する問題