2

由于某些语言不提供互斥锁,因此需要自己构建它。我通常会写一些这样的代码:(伪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只有在我真的需要暂停线程一段时间时才应该使用,所以也许我的情况是错误的。

4

1 回答 1

3

sleep()和相关函数对操作系统进行系统调用,请求操作系统在设定的时间内唤醒进程。在某些情况下(例如接收到信号/异常),操作系统可能会更快地唤醒进程,但在等待期间,进程将获得零 CPU 使用率。

如果操作系统发现所有进程都处于休眠状态(或因某种超时而被阻塞),它可以通过使用特定于硬件的指令使处理器休眠直到出现中断(例如时钟中断、DMA 中断等),从而自行进入休眠状态。收到。

操作系统提供的同步原语的工作方式类似。例如,要求锁定互斥锁会导致系统调用使线程进入休眠状态,直到互斥锁解锁;操作系统知道互斥锁已解锁,因为解锁还必须通过系统调用。

与简单的忙等待循环相比,使用sleep使用的 CPU 少得多。但是,您的操作系统可能至少提供了一些同步原语(如果嵌入式系统以任何方式支持线程,即使嵌入式系统也经常提供这些原语),例如信号量或锁。在尝试推出自己的功能之前,您应该尝试找出您的操作系统是否提供这些功能;如果您使用操作系统提供的同步原语,您的应用程序将具有更好的性能和响应能力。

重要提示:如果您在裸机嵌入式平台上进行开发,则库sleep实际上可能正在等待(例如在 Arduino 上),因为没有操作系统调度程序可以让线程进入睡眠状态。在这种情况下,如果最小化处理器使用率很重要(例如,降低功耗),那么如果您的库没有提供这种方法,您将需要找到一种特定于处理器的方法来挂起 CPU。

于 2012-09-16T01:07:13.910 回答