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