我在Objective中为OSX编写了一个应用程序。它是一个多线程应用程序。一个特定的线程执行一项任务(捕捉屏幕,用TCP套接字写入数据),并睡眠200毫秒。它醒了,又做了同样的工作。这会持续运行,直到程序退出为止。还有一个线程从TCP套接字中读取数据。主线程只显示UI。
当我连续运行这个程序一段时间后(2-3分钟后),第一个线程的200 10睡眠急剧增加到5秒或10秒。我知道,当另一个线程正在运行时,第一个线程的睡眠时间可能会延长。我向第二个线程添加了多个日志打印。我的第二个线程似乎没有阻塞CPU。
当睡眠时间持续很长时间时,我想知道哪一行代码是由CPU执行的,而不是我的第一个线程。有可能知道当前由CPU在特定时间点执行的代码行吗?,这将帮助我调试问题。
最新情况:
为了缩小范围,我创建了一个简单的程序,它每隔200 an就打印一个整数(自动递增)。即使在这个简单的程序中,这个问题也是可以重复的。经过大约300-400次迭代后,方法调用时间增加到10秒(也就是说,整数不是每200 ms打印一次)。每次打印大约10秒后)
#import "AppDelegate.h"
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
Screen* screen = [[Screen alloc] init];
[NSThread detachNewThreadSelector:@selector(firstMethod) toTarget:screen withObject:nil];
}
@end
------------------------------------
#import <Foundation/Foundation.h>
@interface Screen : NSObject
-(void) firstMethod;
-(void) secondMethod;
@end
----------------------------
#import "Screen.h"
@implementation Screen
int i=0;
dispatch_queue_t another_queue;
-(Screen*) init {
self = [super init];
if (self) {
another_queue = dispatch_queue_create("com.test.timer", NULL);
}
return self;
}
-(void) firstMethod {
i++;
NSLog(@"i value : %d",i);
[self secondMethod];
}
-(void) secondMethod {
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 200 * NSEC_PER_MSEC);
dispatch_after(popTime, another_queue, ^(void){
[self firstMethod];
});
}
@end发布于 2014-02-25 09:28:41
正如您所描述的应用程序,“当前由CPU执行的代码行”将在大多数情况下为“无”代码,即。CPU的使用将确实是0%。如果GUI线程实际上没有处理鼠标/KB输入,而其他线程正在等待网络数据或休眠,则什么都不会发生,也没有需要执行的代码,因此不需要CPU。
睡眠()本质上没有什么问题。调用它的线程被阻塞,直到间隔过期,这是由内核中的共享计时器队列确定的。不需要其他线程/计时器/任何东西,调用者的调用/返回上下文也被保留下来(不像使用显式计时器)。睡眠线程在经过的间隔加上一些ms定时器抖动之后(不一定会运行,正如其他人在注释中所描述的那样)。通常情况下,一直在等待的线程(睡眠定时器、I/O或线程间同步)会被赋予临时优先级--在准备就绪时无论如何都会增加,并且非常轻巧地被设置为可以合理地快速运行,除非您的机器超载了运行较高优先级的线程(如果在睡眠期间CPU使用下降到0,则似乎不是这样)。
“第一个线程的200 is睡眠急剧增加到5秒或10秒”的单独问题不太可能是睡眠()调用本身的某个工件。更有可能的是,所传递的间隔实际上已经被某个bug破坏了,或者不是由睡眠()调用产生额外的延迟。也许您的网络发送呼叫由于服务器或链路速度慢且网络缓冲区已满而阻塞了很长一段时间?
https://stackoverflow.com/questions/22005937
复制相似问题