如何在 2 个不同的线程中按顺序打印自然数 Objective-C
How to Print Natural Numbers Sequentially but in 2 different threads Objective-C
我刚开始接触 Objective-C 中的并发。我看了一些并发编程的演示代码。
我想在 2 个不同的线程中按顺序打印自然数。喜欢:
1
: Thread-XX
2
: Thread-YY
3
: Thread-XX
4
: Thread-YY
5
: Thread-XX
6
: Thread-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
}
});
通常当我们从多个线程更新一个变量时,我们会同步我们对该对象的访问,但在这种特殊情况下,这种 "have the threads alternate" 逻辑消除了我们这样做的需要。
我刚开始接触 Objective-C 中的并发。我看了一些并发编程的演示代码。
我想在 2 个不同的线程中按顺序打印自然数。喜欢:
1
: Thread-XX
2
: Thread-YY
3
: Thread-XX
4
: Thread-YY
5
: Thread-XX
6
: Thread-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
}
});
通常当我们从多个线程更新一个变量时,我们会同步我们对该对象的访问,但在这种特殊情况下,这种 "have the threads alternate" 逻辑消除了我们这样做的需要。