1

我是新来的Objective-C并发处理人员。我已经看过一些并发编程的演示代码。如何在2个不同的线程中按顺序打印自然数Objective-C

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

1:螺纹XX

2:螺纹YY

3:螺纹XX

4:螺纹YY

5:螺纹XX

6:螺纹YY

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

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

等等。但我无法弄清楚如何做到这一点。任何帮助?

+0

好的。我明白你的意思。而且我意识到这不是并发性的实际使用,因为它会导致开销问题。但正如我所说,我对并发的范围很陌生。所以我想了解基础知识。我没有偏好,无论是派遣队列还是操作队列,任何人都会做@Rob – nayem

回答

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 
    } 
}); 

通常,当我们要更新多线程一个变量,我们希望我们的那个对象同步访问,但这种“有线程交替“的逻辑消除了我们在这种特殊情况下的需要。

+0

我已经为我的问题添加了一个答案。但我有一些问题。你可以看看吗?这里:[链接](http://stackoverflow.com/a/41426156/3687801) – nayem

+0

@nayem - 你没有什么能够协调日志语句发生的顺序。如果你必须这样做,你会做类似上面的信号量。但更好的是,你应该让它们以最有效的顺序运行,但是在你的应用中使用模型并不关心它们完成的顺序。在抽象中描述这一切都很复杂,所以如果你给我们一个实际的现实世界问题,在这个问题中你倾向于进行这种协调,我们可以提供更好的方法来解决这个问题。 – Rob