由于某些语言不提供互斥锁,因此需要自己构建它。我经常写一些这样的代码:(伪C ++,只是为了让你知道我的意思。我不确定我的写作是否正确,因为我多年没有编写C ++代码)
oldval = 0;
newval = 1;
//suggest there was a Compare And Set operation that make only one thread return true,if no CAS operation , call any other language module that can offer a cas instead
while (!CAS(*somepointer,oldval,newval)) {
//lock failed
sleep(1000); //sleep one second or some value really depend on what you are doing.
}
//lock succeed, do something....
*somepointer = oldval; //release lock.
显然sleep
会降低处理速度,但我常常担心,如果sleep
被丢弃......不会过于频繁地切换线程并降低性能吗?现在我想更深入了,sleep
是如何实现的?如果他们这样做......
expired = getCurrentTime() + sleepTime;
while (getCurrentTime() < expired) { }
......这只会让事情变得更糟。
现在我认为只有在我真的需要暂停线程一段时间才能使用sleep
,所以也许我的情况可能是错误的。
答案 0 :(得分:3)
sleep()
和相关函数向OS发出系统调用,请求OS在设定的时间内唤醒进程。在某些情况下(例如,接收信号/异常),操作系统可能会更快地唤醒进程,但是在等待期间,该进程将获得零CPU使用率。
如果操作系统发现所有进程都处于休眠状态(或在某种超时时被阻塞),它可以通过使用特定于硬件的指令使处理器休眠直到中断(例如时钟中断,DMA中断,收到了。)
OS提供的同步原语的工作方式类似。例如,要求锁定互斥锁会导致系统调用,使线程进入休眠状态,直到互斥锁被解锁;操作系统知道互斥锁已解锁,因为解锁还必须通过系统调用。
与简单的忙等待循环相比,使用sleep
使用的CPU要少得多。但是,您的操作系统可能至少提供某些同步原语(即使嵌入式系统经常提供这些原语,如果它们以任何方式支持线程),例如信号量或锁。在尝试自己动手之前,你应该试着找出你的操作系统是否提供这些功能;如果使用OS提供的同步原语,您的应用程序将具有更好的性能和响应能力。
重要提示:如果您是在裸机嵌入式平台上进行开发,那么库sleep
实际上可能是一个忙碌的等待(就像在Arduino上一样),因为它是没有OS调度程序让线程进入休眠状态。在这种情况下,如果最小化处理器使用率很重要(例如,为了降低功耗),如果您的库没有提供CPU,则需要找到特定于处理器的暂停CPU的方法。