// 定義信號(hào)量
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
// 定義線程執(zhí)行的任務(wù)
void taskA(void *param) {
// 任務(wù)A的具體操作
// ...
}
void taskB(void *param) {
// 任務(wù)B的具體操作
// ...
dispatch_semaphore_signal(sema); // 發(fā)送信號(hào)量
}
void taskC(void *param) {
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); // 等待信號(hào)量
// 任務(wù)C的具體操作
// ...
}
// 創(chuàng)建多線程函數(shù)
void createThreads() {
// 創(chuàng)建線程A
dispatch_queue_t queueA = dispatch_queue_create("com.example.threadA", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queueA, ^{
taskA(NULL);
});
// 創(chuàng)建線程B
dispatch_queue_t queueB = dispatch_queue_create("com.example.threadB", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queueB, ^{
taskB(NULL);
});
// 創(chuàng)建線程C
dispatch_queue_t queueC = dispatch_queue_create("com.example.threadC", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queueC, ^{
taskC(NULL);
});
}
// 主函數(shù)入口
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 創(chuàng)建多線程
createThreads();
// 主線程的操作
// ...
}
return 0;
}
在以上示例代碼中,我們?cè)?taskB 函數(shù)中使用 dispatch_semaphore_signal 函數(shù)來發(fā)送一個(gè)信號(hào)量纲堵,表示B接口已經(jīng)執(zhí)行完畢巡雨;而在 taskC 函數(shù)中則使用 dispatch_semaphore_wait 函數(shù)來等待這個(gè)信號(hào)量,表示要等待B接口執(zhí)行完畢后再執(zhí)行C接口席函。這樣就可以確保C接口在B接口執(zhí)行完畢后再開始執(zhí)行铐望。
需要注意的是,在使用信號(hào)量的時(shí)候需要確保正確地初始化和釋放信號(hào)量,避免出現(xiàn)死鎖等問題正蛙。同時(shí)督弓,對(duì)于復(fù)雜的多線程場(chǎng)景,我們還需要考慮如何優(yōu)化線程的調(diào)度和資源管理乒验,以提高算法的性能和效率愚隧。