如何以2个不同的线程顺序打印自然数目Objective-C

时间:2017-01-02 06:51:11

标签: objective-c concurrency grand-central-dispatch nsoperation

我在Objective-C中使用并发新手。我已经看了一些并发编程的演示代码。

我想按顺序打印自然数,但是要在2个不同的线程中打印。像:

  

1:Thread-XX

     

2:Thread-YY

     

3:Thread-XX

     

4:Thread-YY

     

5:Thread-XX

     

6:Thread-YY

     

.....................

     

.....................

等等。但我无法弄清楚如何做到这一点。有什么帮助吗?

1 个答案:

答案 0 :(得分:2)

我们可以告诉你如何做到这一点,但这不是一个非常有用的场景。你将花费大量时间用信号量等协调这两个线程,这大大降低了在多个线程上运行东西的价值。通常,当您编写多线程代码时,您希望通过最小化等待来自其他线程的某些信号所花费的时间来最大化并发性。这种在这两个线程之间交替的尝试与我们对多线程编程的一般意图相对立。

有人说,它看起来有点像:

dispatch_queue_t xx = dispatch_queue_create("xx", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t yy = dispatch_queue_create("yy", DISPATCH_QUEUE_SERIAL);

dispatch_semaphore_t semaphoreXX = dispatch_semaphore_create(0);
dispatch_semaphore_t semaphoreYY = dispatch_semaphore_create(1);     // seed this with one extra signal from YY

NSInteger __block value = 0;

dispatch_async(xx, ^{
    for (NSInteger i = 0; i < 100; i++) {
        dispatch_semaphore_wait(semaphoreYY, DISPATCH_TIME_FOREVER); // wait for signal from YY
        value += 1;
        NSLog(@"%ld: xx", (long)value);
        [NSThread sleepForTimeInterval:0.1];                         // 1/10 second delay so we can see what's going on
        dispatch_semaphore_signal(semaphoreXX);                      // send signal from XX
    }
});

dispatch_async(yy, ^{
    for (NSInteger i = 0; i < 100; i++) {
        dispatch_semaphore_wait(semaphoreXX, DISPATCH_TIME_FOREVER); // wait for signal from XX
        value += 1;
        NSLog(@"%ld: yy", (long)value);
        [NSThread sleepForTimeInterval:0.5];                         // 1/2 second delay so we can see what's going on
        dispatch_semaphore_signal(semaphoreYY);                      // send signal from YY
    }
});

通常当我们从多个线程更新一个变量时,我们会同步对该对象的访问,但是这个“让线程交替”逻辑消除了我们在这种特殊情况下的需要。