而(1)循环减少CPU没有睡眠

时间:2014-09-30 23:05:35

标签: c loops while-loop cpu

我的问题是我使用rawsocket传递高速率(大于50kpps)流量,两个线程,一个是发送(从缓冲区读取),另一个是接收(写入缓冲区)。

我必须使用while(1)循环以确保无限循环,并且我不能使用usleep从那时起我将丢失数据包(我已经尝试过了)...现在cpu使用率是100%而我认为我我的cpu ... ...

这是代码:

while (1)
{

  if (sendIndex == PACKET_COUNT_MAX)
{
  sendIndex = 0;
}
  else if (ringBuffer[sendIndex].drop == 0)
{if(sendtosocket (ringBuffer, sendIndex, rawout) < 0)
    a++;
    else
    sendIndex++;}
  else if (ringBuffer[sendIndex].drop == 1) {
            ringBuffer[sendIndex].header.free = 1;
            memset (ringBuffer[sendIndex].data, 0, sizeof (ringBuffer[sendIndex].data));
            sendIndex++;
           }
  else
{
  a++;
}
    //nanosleep((struct timespec[]){{0, 5}}, NULL);
}

提前致谢!!!!!!! 莉莎

3 个答案:

答案 0 :(得分:0)

您需要将控制权传递给内核。您可能会发现有用的命令是select。查看http://manpages.courier-mta.org/htmlman2/select.2.html上的整个故事。有关详细信息,请http://www.gnu.org/software/libc/manual/html_node/Waiting-for-I_002fO.html

除了等待来自网络的输入之外,知道除了等待输入之外别无其他事情。或文件系统。或者其他任何文件描述符(U * ix术语)。所以,一旦你有东西要处理,你就让内核唤醒你。

答案 1 :(得分:0)

你可以尝试

  1. 增加接收缓冲区
  2. 使用睡眠减慢sendto,不应丢失数据包
  3. 使用带有recvfrom的MSG_WAITALL标志使其成为阻塞读取,并确保未使用SOCK_NONBLOCK或O_NONBLOCK打开套接字

答案 2 :(得分:0)

您的线程之间需要理智的同步。这包括:

  1. 使用某种锁来确保一个线程在某个线程被或可能被另一个线程修改时不被读取。

  2. 使用某种等待方案,以便发送线程可以等待它的工作而不会旋转。

  3. 结帐pthread_mutex_lockpthread_cond_wait(假设您正在使用POSIX线程)。