Ios 如何让dispatch_after和dispatch_信号量在GCD中协同工作?
我对在之后使用Ios 如何让dispatch_after和dispatch_信号量在GCD中协同工作?,ios,multithreading,grand-central-dispatch,Ios,Multithreading,Grand Central Dispatch,我对在之后使用dispatch\u和dispatch\u信号量来执行一些任务和在每个线程之间等待一段时间感到好奇 我使用以下代码: dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3ull * NSEC_PER_SEC); dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_semaphor
dispatch\u和dispatch\u信号量
来执行一些任务和在每个线程之间等待一段时间感到好奇
我使用以下代码:
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3ull * NSEC_PER_SEC);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
dispatch_after(time, queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"blk01");
dispatch_semaphore_signal(semaphore);
});
dispatch_after(time, queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"blk02");
dispatch_semaphore_signal(semaphore);
});
dispatch_after(time, queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"blk03");
dispatch_semaphore_signal(semaphore);
});
我将在3秒后得到线程的执行,而不是预期的延迟
我做错了什么?在dispatch\u semaphore\t中,有没有其他方法可以在每个线程执行之间使用延迟时间执行线程?您的代码不会要求每次调用之间有3秒的延迟。它在同一时间调度3个块,所有3个块都使用信号量和日志
您需要调整用于为每个后续块分派的时间,或者需要在每个先前调用中安排后续dispatch\u after()
调用。前者可能更简单,并且会让您获得更精确的计时。如果使用后者,请确保在每个块中重新计算时间,因为这是指绝对时间,而不是相对持续时间。您的代码不会要求每次调用之间有3秒的延迟。它在同一时间调度3个块,所有3个块都使用信号量和日志
您需要调整用于为每个后续块分派的时间,或者需要在每个先前调用中安排后续dispatch\u after()
调用。前者可能更简单,并且会让您获得更精确的计时。如果使用后者,请确保在每个块中重新计算时间
,因为这是指绝对时间,而不是相对持续时间。如果要连续执行三个块(而不是同时执行),并且要在块之间暂停,有比使用信号量更简单的方法。最简单的方法是创建一个串行队列,并在每个块的开始或结束处放置一个sleep
(或usleep
):
dispatch_queue_t queue = dispatch_queue_create("my queue", 0);
dispatch_async(queue, ^{
sleep(3);
NSLog(@"blk01");
});
dispatch_async(queue, ^{
sleep(3);
NSLog(@"blk02");
});
dispatch_async(queue, ^{
sleep(3);
NSLog(@"blk03");
});
dispatch_release(queue);
在块中放入sleep
非常简单,但会占用线程。这可能无关紧要,除非你正在创建大量队列并在其中许多队列上睡觉
如果你告诉我们为什么你认为你需要一个信号量,也许我们可以为你提供一个更好的选择或者如何正确使用它的建议。如果你想连续执行三个块(而不是同时执行),并且想在块之间暂停,有比使用信号量更简单的方法。最简单的方法是创建一个串行队列,并在每个块的开始或结束处放置一个sleep
(或usleep
):
dispatch_queue_t queue = dispatch_queue_create("my queue", 0);
dispatch_async(queue, ^{
sleep(3);
NSLog(@"blk01");
});
dispatch_async(queue, ^{
sleep(3);
NSLog(@"blk02");
});
dispatch_async(queue, ^{
sleep(3);
NSLog(@"blk03");
});
dispatch_release(queue);
在块中放入sleep
非常简单,但会占用线程。这可能无关紧要,除非你正在创建大量队列并在其中许多队列上睡觉
如果你告诉我们为什么你认为你需要一个信号量,也许我们可以为你提供一个更好的选择或如何正确使用它的建议。它像一个符咒一样工作,不特别是调度信号量,只是好奇和有正确的方法。如果执行块需要超过设置时间怎么办?它像符咒一样工作,dispatch_信号量没有什么特别的功能,只是好奇,并且有正确的方法来完成。如果执行块需要的时间超过设置的时间怎么办?是的,经过几次尝试,它只调整了时间就工作了。非常感谢您对绝对/相对时间的解释。是的,经过几次尝试,调整时间就奏效了。非常感谢您对绝对/相对时间的解释。