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_信号量没有什么特别的功能,只是好奇,并且有正确的方法来完成。如果执行块需要的时间超过设置的时间怎么办?是的,经过几次尝试,它只调整了时间就工作了。非常感谢您对绝对/相对时间的解释。是的,经过几次尝试,调整时间就奏效了。非常感谢您对绝对/相对时间的解释。