生產問題:
1. 上傳100個psd
2. 每個psd內 100個圖
3. 需要知道上傳完每個psd 和 所有psd的時
思路:
1. n個psd之間使用序列處理;
2. psd中的n個使用併發處理, 使用訊號量控制併發數;
3. 上傳內部又有3個異網路請求, 使用執行緒組實現穿透同步;
//標頭檔案
@inte***ce psdmodel : nsobject
//psd開始時間
@property (nonatomic, strong) nsstring *starttime;
//psd結束時間
@property (nonatomic, strong) nsstring *endtime;
//psd id
@property (nonatomic, assign) nsinteger pid;
//集合
@property (nonatomic, strong) nsarray *datasource;
///完成個數
@property (nonatomic, strong) nsstring * donecount;
//訊號量, 用來控制內部併發數量
@property (nonatomic, strong) dispatch_semaphore_t semaphore;
@end
//實現
#import "psdmodel.h"
@implementation psdmodel
- (instancetype)init
return self;
}@end
//標頭檔案
@inte***ce model : nsobject
//記錄開始時間
@property (nonatomic, strong) nsstring *starttime;
//記錄結尾時間
@property (nonatomic, strong) nsstring *endtime;
@property (nonatomic, strong) nsstring *imagestr;
//id
@property (nonatomic, assign) nsinteger id;
//執行緒組
@property (nonatomic, strong) dispatch_group_t uploadgroup;
//記錄上傳錯誤次數
@property (nonatomic, assign) nsinteger uploaderrorcount;
@end
//實現:
#import "model.h"
@implementation model
- (instancetype)init
return self;
}@end
#import "viewcontroller.h"
#import "psdmodel.h"
#import "model.h"
typedef void (^backresult)(nsinteger);
@inte***ce viewcontroller ()
//操作佇列
@property (nonatomic, strong) nsoperationqueue *taskqueue;
//存放psd
@property (nonatomic, strong) nsmutablearray * temparray;
//當前正在執行的psd
@property (nonatomic, strong) psdmodel * currentpsdmodel;
//記錄暫停
@property (nonatomic, assign) bool isstop;
///記錄所有的psd時間
@property (nonatomic, strong) nsstring *starttime;
@property (nonatomic, strong) nsstring *endtime;
@end
@implementation viewcontroller
-(nsmutablearray *)temparray
return _temparray;
}/**
1. 上傳100個psd
2. 每個psd內 100個圖
3. 需要知道上傳完每個psd 和 所有psd的時間
*/- (void)viewdidload
//資料構造
- (void)setdatasource
psdmodel.datasource = array;
psdmodel.pid = (n+1)*10000;
[self.temparray addobject:psdmodel];
}}-(void)touchesbegan:(nsset*)touches withevent:(uievent *)event
-(void)run
if (self.temparray.count > index+1)
}else
if (self.currentpsdmodel == nil)
nslog(@"開始psd, %ld", self.currentpsdmodel.pid);
[self.currentpsdmodel addobserver:self forkeypath:@"donecount" options:nskeyvalueobservingoptionnew|nskeyvalueobservingoptionold context:nil];
self.currentpsdmodel.starttime = [self getcurrenttimestringtomillisecond];
[self startdopsd];
}-(void)stop
}-(void)dealloc
}//監聽當前的psd是否上傳完畢
- (void)observevalueforkeypath:(nsstring *)keypath ofobject:(id)object change:(nsdictionary*)change context:(void *)context
}}//開始遍歷上傳
-(void)startdopsd
model *model = psdmodel.datasource[i];
[self task:model];
}}- (nsstring *)getcurrenttimestringtomillisecond
//表示乙個上傳任務
-(void)task:(model *)model
}else
}}];
});}-(void)sign:(model *)model);
}-(void)auth:(model *)model);
}-(void)upload:(model *)model andback:(backresult)backresult
});}@end
多執行緒 訊號量
訊號量 semaphore類 建立帶指定許可數的訊號量 semaphore semaphore new semaphore 1 建立乙個許可的訊號量 訊號量用來限制訪問共享數資源的執行緒數。在訪問資源之前,執行緒必須從訊號量獲取許可,在訪問完資源後釋放訊號量。任務通過呼叫訊號量的acquire 方法...
多執行緒通訊 訊號量
當當前資源的數量大於0的時候,等待訊號量的執行緒可以獲得乙個資源並繼續執行,訊號量的當前資源數量將減1,如果當前資源的數量為0,則等待訊號量的執行緒將處於等待狀態,直到有執行緒釋放訊號量,使訊號量標識的資源數量大於0 handle createsemaphore lpsecurity attribu...
多執行緒之訊號量
本文的訊號量型別為posix無名訊號量 1 訊號量基礎知識 2 訊號量的主要用到的函式 int sem init sem t sem,int pshared,unsigned int value int sem destroy sem t sem int sem wait sem t sem int...