1

mutlithread介して通信するクライアントサーバーアプリケーションがありますsockets。この構造で新しいスレッドを作成します。

 pthread_t thread;
 pthread_create(&thread, NULL, c->sendMessage, (void *) fd);

ここfdで、 は接続の ID でありc->sendMessage、新しいスレッドが作成された後に呼び出され、このスレッドを処理する関数です。この関数内で、メッセージを送信する必要がありますsend(int sockfd, const void *buf, size_t len, int flags);

だから私はsockfdこのようになります:

void * Client::sendMessage(void *threadid) {
   int sockfd = (int) threadid;
   // some more code here and in the end I send the data via send(int sockfd, const void *buf, size_t len, int flags)
}

私はフラグを付けてコンパイルしますが-pedantic、ほとんどのコンパイラ (私のものを含む) はコンパイル中に警告やエラーをスローしません。しかし、コンパイル中にvoid *toからのこの再入力intは安全ではなく、loose of precision. これは良い解決策ではなく、よりクリーンに行う必要があることを理解しています。しかし、私は方法を見つけることができません。ponter を int に再入力し、コンパイル中の警告を回避する方法など、クリーンなプラクティスを誰かにアドバイスしてもらえますか?

4

3 に答える 3

0

のようなものを追加static_assert(sizeof(fd) <= sizeof(void*), "problem")して、この状況で reinterpret_cast が往復するという実装のドキュメントに依存することができます。

于 2013-06-07T11:47:31.150 に答える