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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
shiro4ao

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

#1

投稿記事 by shiro4ao » 15年前

ソケット(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:無題

#2

投稿記事 by シエル » 15年前

少しSleepして間隔を空けた方がいいのでは?

shiro4ao

Re:無題

#3

投稿記事 by shiro4ao » 15年前

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

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

Justy

Re:無題

#4

投稿記事 by Justy » 15年前

 ブロッキングモードですか?
 その 100%になっているとき常に send関数を通過していますか?

shiro4ao

Re:無題

#5

投稿記事 by shiro4ao » 15年前

プログラムは非同期で作っており、右から左へ受け流す部分がメインとは別の
スレッドになっています。
100%になってしまうと送信しなくても100%から戻ってこないようでした。

Justy

Re:無題

#6

投稿記事 by Justy » 15年前

>100%になってしまうと送信しなくても100%から戻ってこないようでした
 ということはデータが来ていない状態で recvが呼ばれ続けている、ポーリング状態になっている
わけですね。

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

shiro4ao

Re:無題

#7

投稿記事 by shiro4ao » 15年前

通信の確実さは犠牲にしてでも非同期モードで送信させてみます。
ありがとうございました。 画像

閉鎖

“C言語何でも質問掲示板” へ戻る