考察点:

  • NSLock锁运用
  • 异步转同步
  • 并发队列

启动三个线程A,B,C,打印10次 按照ABC的顺序输出

  1. dispatch_queue_t queueA = dispatch_queue_create("queuea", DISPATCH_QUEUE_CONCURRENT);
  2. dispatch_async(queueA, ^{
  3. for (int i = 0; i<10; i++) {
  4. NSLog(@"A======= %@",@(i));
  5. }
  6. });
  7. dispatch_queue_t queueB = dispatch_queue_create("queueb", DISPATCH_QUEUE_CONCURRENT);
  8. dispatch_async(queueB, ^{
  9. for (int i = 0; i<10; i++) {
  10. NSLog(@"B======= %@",@(i));
  11. }
  12. });
  13. dispatch_queue_t queueC = dispatch_queue_create("queuec", DISPATCH_QUEUE_CONCURRENT);
  14. dispatch_async(queueC, ^{
  15. for (int i = 0; i<10; i++) {
  16. NSLog(@"C======= %@",@(i));
  17. NSLog(@" ");
  18. }
  19. });

利用NSLock实现

  1. NSLock *lockA = [[NSLock alloc] init];
  2. NSLock *lockB = [[NSLock alloc] init];
  3. NSLock *lockC = [[NSLock alloc] init];
  4. [lockB lock];
  5. [lockC lock];
  6. dispatch_queue_t queueA = dispatch_queue_create("queuea", DISPATCH_QUEUE_CONCURRENT);
  7. dispatch_async(queueA, ^{
  8. for (int i = 0; i<10; i++) {
  9. [lockA lock];
  10. NSLog(@"A======= %@",@(i));
  11. [lockB unlock];
  12. }
  13. });
  14. dispatch_queue_t queueB = dispatch_queue_create("queueb", DISPATCH_QUEUE_CONCURRENT);
  15. dispatch_async(queueB, ^{
  16. for (int i = 0; i<10; i++) {
  17. [lockB lock];
  18. NSLog(@"B======= %@",@(i));
  19. [lockC unlock];
  20. }
  21. });
  22. dispatch_queue_t queueC = dispatch_queue_create("queuec", DISPATCH_QUEUE_CONCURRENT);
  23. dispatch_async(queueC, ^{
  24. for (int i = 0; i<10; i++) {
  25. [lockC lock];
  26. NSLog(@"C======= %@",@(i));
  27. NSLog(@" ");
  28. [lockA unlock];
  29. }
  30. });
  31. 2019-06-20 01:06:23.384170+0800 xxtest[2808:669702] A======= 0
  32. 2019-06-20 01:06:23.384379+0800 xxtest[2808:669701] B======= 0
  33. 2019-06-20 01:06:23.384515+0800 xxtest[2808:669703] C======= 0
  34. 2019-06-20 01:06:23.384613+0800 xxtest[2808:669703]
  35. 2019-06-20 01:06:23.384750+0800 xxtest[2808:669702] A======= 1
  36. 2019-06-20 01:06:23.384878+0800 xxtest[2808:669701] B======= 1
  37. 2019-06-20 01:06:23.384992+0800 xxtest[2808:669703] C======= 1
  38. 2019-06-20 01:06:23.385716+0800 xxtest[2808:669703]
  39. 2019-06-20 01:06:23.386194+0800 xxtest[2808:669702] A======= 2
  40. 2019-06-20 01:06:23.386590+0800 xxtest[2808:669701] B======= 2
  41. 2019-06-20 01:06:23.387100+0800 xxtest[2808:669703] C======= 2
  42. 2019-06-20 01:06:23.387497+0800 xxtest[2808:669703]
  43. 2019-06-20 01:06:23.387857+0800 xxtest[2808:669702] A======= 3
  44. 2019-06-20 01:06:23.388317+0800 xxtest[2808:669701] B======= 3
  45. 2019-06-20 01:06:23.388663+0800 xxtest[2808:669703] C======= 3
  46. 2019-06-20 01:06:23.388969+0800 xxtest[2808:669703]
  47. 2019-06-20 01:06:23.389857+0800 xxtest[2808:669702] A======= 4
  48. 2019-06-20 01:06:23.390137+0800 xxtest[2808:669701] B======= 4
  49. 2019-06-20 01:06:23.390546+0800 xxtest[2808:669703] C======= 4
  50. 2019-06-20 01:06:23.390847+0800 xxtest[2808:669703]
  51. 2019-06-20 01:06:23.391203+0800 xxtest[2808:669702] A======= 5
  52. 2019-06-20 01:06:23.391476+0800 xxtest[2808:669701] B======= 5
  53. 2019-06-20 01:06:23.391854+0800 xxtest[2808:669703] C======= 5
  54. 2019-06-20 01:06:23.392134+0800 xxtest[2808:669703]
  55. 2019-06-20 01:06:23.392443+0800 xxtest[2808:669702] A======= 6
  56. 2019-06-20 01:06:23.392804+0800 xxtest[2808:669701] B======= 6
  57. 2019-06-20 01:06:23.393107+0800 xxtest[2808:669703] C======= 6
  58. 2019-06-20 01:06:23.393413+0800 xxtest[2808:669703]
  59. 2019-06-20 01:06:23.393685+0800 xxtest[2808:669702] A======= 7
  60. 2019-06-20 01:06:23.394006+0800 xxtest[2808:669701] B======= 7
  61. 2019-06-20 01:06:23.394301+0800 xxtest[2808:669703] C======= 7
  62. 2019-06-20 01:06:23.394578+0800 xxtest[2808:669703]
  63. 2019-06-20 01:06:23.394959+0800 xxtest[2808:669702] A======= 8
  64. 2019-06-20 01:06:23.395532+0800 xxtest[2808:669701] B======= 8
  65. 2019-06-20 01:06:23.395873+0800 xxtest[2808:669703] C======= 8
  66. 2019-06-20 01:06:23.396117+0800 xxtest[2808:669703]
  67. 2019-06-20 01:06:23.396508+0800 xxtest[2808:669702] A======= 9
  68. 2019-06-20 01:06:23.396897+0800 xxtest[2808:669701] B======= 9
  69. 2019-06-20 01:06:23.397307+0800 xxtest[2808:669703] C======= 9
  70. 2019-06-20 01:06:23.397649+0800 xxtest[2808:669703]

利用信号量实现

  1. dispatch_semaphore_t semaA = dispatch_semaphore_create(1);
  2. dispatch_semaphore_t semaB = dispatch_semaphore_create(0);
  3. dispatch_semaphore_t semaC = dispatch_semaphore_create(0);
  4. dispatch_queue_t queueA = dispatch_queue_create("queuea", DISPATCH_QUEUE_CONCURRENT);
  5. dispatch_async(queueA, ^{
  6. for (int i = 0; i<10; i++) {
  7. dispatch_semaphore_wait(semaA, DISPATCH_TIME_FOREVER);
  8. NSLog(@"A======= %@",@(i));
  9. dispatch_semaphore_signal(semaB);
  10. }
  11. });
  12. dispatch_queue_t queueB = dispatch_queue_create("queueb", DISPATCH_QUEUE_CONCURRENT);
  13. dispatch_async(queueB, ^{
  14. for (int i = 0; i<10; i++) {
  15. dispatch_semaphore_wait(semaB, DISPATCH_TIME_FOREVER);
  16. NSLog(@"B======= %@",@(i));
  17. dispatch_semaphore_signal(semaC);
  18. }
  19. });
  20. dispatch_queue_t queueC = dispatch_queue_create("queuec", DISPATCH_QUEUE_CONCURRENT);
  21. dispatch_async(queueC, ^{
  22. for (int i = 0; i<10; i++) {
  23. dispatch_semaphore_wait(semaC, DISPATCH_TIME_FOREVER);
  24. NSLog(@"C======= %@",@(i));
  25. NSLog(@" ");
  26. dispatch_semaphore_signal(semaA);
  27. }
  28. });
  29. 2019-06-20 01:40:25.050013+0800 xxtest[2938:708288] A======= 0
  30. 2019-06-20 01:40:25.050183+0800 xxtest[2938:708285] B======= 0
  31. 2019-06-20 01:40:25.050297+0800 xxtest[2938:708286] C======= 0
  32. 2019-06-20 01:40:25.050391+0800 xxtest[2938:708286]
  33. 2019-06-20 01:40:25.050487+0800 xxtest[2938:708288] A======= 1
  34. 2019-06-20 01:40:25.050588+0800 xxtest[2938:708285] B======= 1
  35. 2019-06-20 01:40:25.050684+0800 xxtest[2938:708286] C======= 1
  36. 2019-06-20 01:40:25.050782+0800 xxtest[2938:708286]
  37. 2019-06-20 01:40:25.050881+0800 xxtest[2938:708288] A======= 2
  38. 2019-06-20 01:40:25.050982+0800 xxtest[2938:708285] B======= 2
  39. 2019-06-20 01:40:25.051442+0800 xxtest[2938:708286] C======= 2
  40. 2019-06-20 01:40:25.051695+0800 xxtest[2938:708286]
  41. 2019-06-20 01:40:25.051928+0800 xxtest[2938:708288] A======= 3
  42. 2019-06-20 01:40:25.052162+0800 xxtest[2938:708285] B======= 3
  43. 2019-06-20 01:40:25.052414+0800 xxtest[2938:708286] C======= 3
  44. 2019-06-20 01:40:25.052841+0800 xxtest[2938:708286]
  45. 2019-06-20 01:40:25.053073+0800 xxtest[2938:708288] A======= 4
  46. 2019-06-20 01:40:25.053340+0800 xxtest[2938:708285] B======= 4
  47. 2019-06-20 01:40:25.053617+0800 xxtest[2938:708286] C======= 4
  48. 2019-06-20 01:40:25.053843+0800 xxtest[2938:708286]
  49. 2019-06-20 01:40:25.054094+0800 xxtest[2938:708288] A======= 5
  50. 2019-06-20 01:40:25.055448+0800 xxtest[2938:708285] B======= 5
  51. 2019-06-20 01:40:25.055584+0800 xxtest[2938:708286] C======= 5
  52. 2019-06-20 01:40:25.055757+0800 xxtest[2938:708286]
  53. 2019-06-20 01:40:25.055888+0800 xxtest[2938:708288] A======= 6
  54. 2019-06-20 01:40:25.056116+0800 xxtest[2938:708285] B======= 6
  55. 2019-06-20 01:40:25.056455+0800 xxtest[2938:708286] C======= 6
  56. 2019-06-20 01:40:25.056871+0800 xxtest[2938:708286]
  57. 2019-06-20 01:40:25.057176+0800 xxtest[2938:708288] A======= 7
  58. 2019-06-20 01:40:25.057484+0800 xxtest[2938:708285] B======= 7
  59. 2019-06-20 01:40:25.057789+0800 xxtest[2938:708286] C======= 7
  60. 2019-06-20 01:40:25.058204+0800 xxtest[2938:708286]
  61. 2019-06-20 01:40:25.058479+0800 xxtest[2938:708288] A======= 8
  62. 2019-06-20 01:40:25.058947+0800 xxtest[2938:708285] B======= 8
  63. 2019-06-20 01:40:25.059211+0800 xxtest[2938:708286] C======= 8
  64. 2019-06-20 01:40:25.059469+0800 xxtest[2938:708286]
  65. 2019-06-20 01:40:25.059701+0800 xxtest[2938:708288] A======= 9
  66. 2019-06-20 01:40:25.060025+0800 xxtest[2938:708285] B======= 9
  67. 2019-06-20 01:40:25.060360+0800 xxtest[2938:708286] C======= 9
  68. 2019-06-20 01:40:25.060585+0800 xxtest[2938:708286]