多執行緒實戰 執行緒組 訊號量 操作佇列

2021-10-17 14:20:56 字數 3700 閱讀 4375

生產問題:

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...