ページ 11

受信時のスピンロック回避方法

Posted: 2010年6月15日(火) 20:34
by shiro4ao
ソケット(sock1)からのデータをもう一方のソケット(sock2)に送るスレッドを作りたいです。
以下のコードで一応できたのですがCPU使用率が100%になってしまいます。

DWORD WINAPI Thread1(LPVOID lpvoid ) {
while{
char tmp1[1024];
int ret1;
while((ret1=recv(sock1, tmp1,1000, 0))>0){
send(sock2,tmp1,ret1, 0);
}
ExitThread(TRUE);
}
}

スピンロックになっているようですが、なにか解決策はありますでしょうか。
あまりにも長いため全ソースコードはお見せできませんが出来る限りご質問にはお答えしたいと
思います。 画像

Re:無題

Posted: 2010年6月15日(火) 20:37
by シエル
少しSleepして間隔を空けた方がいいのでは?

Re:無題

Posted: 2010年6月15日(火) 20:50
by shiro4ao
通信内容の問題があり、sleep()できないのです・・・・
やはりCPU100%でrecv()させるしかないのでしょうか・・・・
非同期で似たようななものを作ったのですが(FD_READが来たら送る)
sock1からsock2のデータ送信中にsock2からsock1へのデータが来たら
上手くいかない(?)ような感じでした。

追伸:先の質問(文字列をわけて配列に入れる)が解決いたしました
   ありがとうございました。

Re:無題

Posted: 2010年6月15日(火) 21:11
by Justy
 ブロッキングモードですか?
 その 100%になっているとき常に send関数を通過していますか?

Re:無題

Posted: 2010年6月15日(火) 21:15
by shiro4ao
プログラムは非同期で作っており、右から左へ受け流す部分がメインとは別の
スレッドになっています。
100%になってしまうと送信しなくても100%から戻ってこないようでした。

Re:無題

Posted: 2010年6月15日(火) 21:37
by Justy
>100%になってしまうと送信しなくても100%から戻ってこないようでした
 ということはデータが来ていない状態で recvが呼ばれ続けている、ポーリング状態になっている
わけですね。

 selectを使うとかブロッキングモードにしてみてはどうでしょう?

Re:無題

Posted: 2010年6月16日(水) 10:56
by shiro4ao
通信の確実さは犠牲にしてでも非同期モードで送信させてみます。
ありがとうございました。 画像