代表,对不起我完美的英语。
我最近用C ++编写了自己的Linux恶魔(确切地说是OpenWRT路由器),我遇到了问题。
那里有几个线程,每个打开的TCP连接一个,主线程等待新的TCP连接,并且,正如我所说的,指挥官线程检查状态。
每件事情都很好,但我的CPU总是100%。我现在认为它是因为指挥官代码:
void *CommanderThread(void* arg)
{
Commander* commander = (Commander*)arg;
pthread_detach(pthread_self());
clock_t endwait;
while(true)
{
uint8_t temp;
endwait = clock () + (int)(1 * CLOCKS_PER_SEC);
for(int i=0;i<commander->GetCount();i++)
{
ptrRelayBoard rb = commander->GetBoard(i);
if (rb!= NULL)
rb->Get(0x01,&temp);
}
while (clock() < endwait);
}
return NULL;
}
正如你所看到的,该程序每1秒做一次。时间在这里并不重要。我知道CPU总是在检查时间过去了。我试过做这样的事情: while(clock()&lt; endwait) usleep(200); 但是当函数usleep(并且也是睡眠)接缝来冻结时钟增量(它在usleep之后总是一个恒定值)。
是否有任何解决方案,准备好的功能(如phread_sleep(20ms)),或者为我的问题四处走动?也许我应该以某种方式访问主时钟?
这里不是那么关键我几乎可以检查执行状态检查花了多长时间(之前锁定时钟(),与之比较),并计算值作为usleep函数的参数。但在其他线程中,我想使用此表单。
睡着了整个过程是要冻结吗?
我目前正在Cygwin上调试它,但不认为这里存在问题。
感谢任何答案和建议,非常感谢。
J.L。
答案 0 :(得分:2)
如果它不需要精确到1秒,那么只需要睡一秒钟。 usleep和sleep将当前线程置于一个有效的等待状态,该状态至少是您请求的时间量(然后它才有资格再次安排)。
如果您没有尝试接近确切的时间,则无需检查时钟()。
答案 1 :(得分:0)
我已经以其他方式解决了这个问题。
#include <sys/time.h>
#define CLOCK_US_IN_SECOND 1000000
static long myclock()
{
struct timeval tv;
gettimeofday(&tv, NULL);
return (tv.tv_sec * CLOCK_US_IN_SECOND) + tv.tv_usec;
}
void *MainThread(void* arg)
{
Commander* commander = (Commander*)arg;
pthread_detach(pthread_self());
long endwait;
while(true)
{
uint8_t temp;
endwait = myclock() + (int)(1 * CLOCK_US_IN_SECOND);
for(int i=0;i<commander->GetCount();i++)
{
ptrRelayBoard rb = commander->GetBoard(i);
if (rb!= NULL)
rb->Get(0x01,&temp);
}
while (myclock() < endwait)
usleep((int)0.05*CLOCK_US_IN_SECOND);
}
return NULL;
}
请记住,此代码在执行期间易受时间变化的影响。不知道如何省略,但在我的情况下,它并不重要。