我正在Objective-C中編寫OSX應用程序。這是一個多線程應用程序。一個特定的線程執行一項任務(捕獲屏幕,在TCP套接字中寫入數據)並休眠200毫秒。它醒來後再次做同樣的工作。這一直持續到程序退出。還有另一個從TCP套接字讀取數據的線程。主線程僅顯示UI。CPU在特定時間點執行的當前代碼行
當我連續運行該程序一段時間後(2-3分鐘後),第一個線程的200ms睡眠時間急劇增加到5秒或10秒。我明白,當另一個線程正在運行時,第一個線程的休眠時間可能會延長。我添加了多個日誌打印到第二個線程。看來我的第二個線程不會阻塞CPU。
當睡眠時間持續很長一段時間時,我想知道除了我的第一個線程以外CPU執行哪一行代碼。 是否有可能知道CPU在特定時間點執行的當前代碼行?這將幫助我調試問題。
UPDATE:
爲了縮小範圍,我創建了一個簡單的程序,只是打印一個整數(自動遞增)每200ms。即使在這個簡單的程序中,問題也是可重複的。後一些300-400次迭代,方法調用時間增加至〜10秒(即,整數不是每200ms印刷,它在打印後約〜每次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
對於睡眠,我用[NSThread sleepForTimeInterval:] 我也嘗試過dispatch_after(),結果相同。 –
您可以使用'trace(1)'從您的應用程序獲取這種信息,甚至更容易,您可以使用它。也就是說,你應該使用一個合適的計時器,而不是一個正在睡覺的線程來做到這一點。 –
@JasonCoco, 1.我認爲trace(1)必須插入我的代碼中。我將在哪裏添加這行代碼?當線程休眠時,我不知道正在執行的行(而是阻塞CPU)。 2。我試過Instruments,當線程休眠時,CPU變爲0%,我無法理解它的含義。這是否意味着我的線程正在等待某些資源?爲了避免睡眠,我甚至試過dispatch_after()。我也得到了同樣的結果(再次執行作業之前的延長時間)。 –