// 定义信号量
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
// 定义线程执行的任务
void taskA(void *param) {
// 任务A的具体操作
// ...
}
void taskB(void *param) {
// 任务B的具体操作
// ...
dispatch_semaphore_signal(sema); // 发送信号量
}
void taskC(void *param) {
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); // 等待信号量
// 任务C的具体操作
// ...
}
// 创建多线程函数
void createThreads() {
// 创建线程A
dispatch_queue_t queueA = dispatch_queue_create("com.example.threadA", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queueA, ^{
taskA(NULL);
});
// 创建线程B
dispatch_queue_t queueB = dispatch_queue_create("com.example.threadB", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queueB, ^{
taskB(NULL);
});
// 创建线程C
dispatch_queue_t queueC = dispatch_queue_create("com.example.threadC", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queueC, ^{
taskC(NULL);
});
}
// 主函数入口
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 创建多线程
createThreads();
// 主线程的操作
// ...
}
return 0;
}
在以上示例代码中,我们在 taskB 函数中使用 dispatch_semaphore_signal 函数来发送一个信号量,表示B接口已经执行完毕;而在 taskC 函数中则使用 dispatch_semaphore_wait 函数来等待这个信号量,表示要等待B接口执行完毕后再执行C接口。这样就可以确保C接口在B接口执行完毕后再开始执行。
需要注意的是,在使用信号量的时候需要确保正确地初始化和释放信号量,避免出现死锁等问题。同时,对于复杂的多线程场景,我们还需要考虑如何优化线程的调度和资源管理,以提高算法的性能和效率。