今天碰到一个问题,在多线程处理时,一个线程处理停止了,一开始以为是死锁了,但是过一段时间后,又正常运行了。又仔细看了下处理,才发现是usleep的问题。
sleep和usleep都是使用alarm的信号机制实现等待。入股多线程同时usleep或者sleep时,就有可能造成程序阻塞。
如果需要进行线程等待的话,使用nanosleep或者select来代替。
select实现等待方式如下所示:
int threadDelay(const long lTimeSec, const long lTimeUSec)
{
timeval timeOut;
timeOut.tv_sec = lTimeSec;
timeOut.tv_usec = lTimeUSec;
if (0 != select(0, NULL, NULL, NULL, &timeOut))
{
return 1;
}
return 0;
}
修改使用select后果断问题解决了。