我是新來的Objective-C併發處理人員。我已經看過一些併發編程的演示代碼。如何在2個不同的線程中按順序打印自然數Objective-C
我想按順序打印自然數,但在2個不同的線程。像:
1
:螺紋XX
2
:螺紋YY
3
:螺紋XX
4
:螺紋YY
5
:螺紋XX
6
:螺紋YY.....................
................ .....
等等。但我無法弄清楚如何做到這一點。任何幫助?
我是新來的Objective-C併發處理人員。我已經看過一些併發編程的演示代碼。如何在2個不同的線程中按順序打印自然數Objective-C
我想按順序打印自然數,但在2個不同的線程。像:
1
:螺紋XX
2
:螺紋YY
3
:螺紋XX
4
:螺紋YY
5
:螺紋XX
6
:螺紋YY.....................
................ .....
等等。但我無法弄清楚如何做到這一點。任何幫助?
我們可以告訴你如何做到這一點,但這不是一個非常有用的場景。你將花費大量的時間用信號量或類似的東西來協調這兩個線程,這在很大程度上降低了在多線程上運行的東西的價值。通常,在編寫多線程代碼時,您希望通過最大限度地減少等待某個其他線程的某些信號所花費的時間來最大限度地提高併發性。這種在這兩個線程之間交替的嘗試與我們的多線程編程的一般意圖是對立的。
話雖如此,它可能看起來有點像:
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
}
});
通常,當我們要更新多線程一個變量,我們希望我們的那個對象同步訪問,但這種「有線程交替「的邏輯消除了我們在這種特殊情況下的需要。
好的。我明白你的意思。而且我意識到這不是併發性的實際使用,因爲它會導致開銷問題。但正如我所說,我對併發的範圍很陌生。所以我想了解基礎知識。我沒有偏好,無論是派遣隊列還是操作隊列,任何人都會做@Rob – nayem