2015-12-08 3 views
0

Работа над проектом для школы в C с использованием Pthreads для разбиения одномерного массива на подматрицы tRows и tCols. Общий массив будет иметь размер wRows и wCols. Скажем wCols = 4, wRows = 4, tCols = 2, и tRows = 2. Если ввод массива целых чисел 1-16 мы имели бы сетку:Распределение массива Pthreads

1 2 3 4 
5 6 7 8 
9 10 11 12 
1314 15 17 

Thus Thread 0 would process the subgrid 
1 2 
5 6 

Thread 1 
3 4 
7 8 

Thread 2 
9 10 
13 14 

Thread 3 
11 12 
15 17 

Как бы я идти о переборе одномерный массив, чтобы получить эти значения на основе того, какой поток используется с использованием двух циклов? Мне кажется, что мне нужно рассчитать начало и конец для обоих потоков, но я полностью застрял в этом.

Любая помощь будет оценена по достоинству.

+0

Что делать, если размерность не делится eqaully? Например. как вы разделитесь, если Wcols = 5 и wRows = 3? –

+0

@ l3x Он всегда будет делимым. – Downwithopp

+0

Количество потоков также зависит от количества сеток? –

ответ

1

Четвертый аргумент pthread_create() пересылается в функцию начала потока в качестве аргумента. Целью этого является передача в поток любых необходимых потоков данных, таких как, например, начальная строка и столбец ее патча матрицы.

В этом случае было бы особенно чистым передать каждому потоку указатель на верхний, самый левый элемент его матричного патча. Предположим, что размер патча и количество столбцов в матрице известны каждому потоку, этого достаточно, чтобы определить номера строк и столбцов.

0

Это, как я это сделал (что делает использование четвертого аргумента, как описано в первом ответе):

- (void)main { 
    for (NSInteger index = 0; index < AppDelegate.sharedAppDelegate.getAssetCount; index++) { 
     dispatch_queue_t threadQueue = dispatch_queue_create([[NSString stringWithFormat:@"threadQueue %ld", index] UTF8String], DISPATCH_QUEUE_CONCURRENT); 
     dispatch_async(threadQueue, ^{ 
      pthread_t thread_tid; 
      pthread_attr_t attr; 
      int   returnVal; 

      // init and check if init a new thread successful 
      returnVal = pthread_attr_init(&attr); 
      assert(!returnVal); 

      // set attribute detach state for new thread 
      returnVal = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 
      assert(!returnVal); 

      // create and run the new thread 
      int threadError = pthread_create_from_mach_thread(&thread_tid, &attr, &ThreadMethod, (void*)index); 
      returnVal = pthread_attr_destroy(&attr); 
      assert(!returnVal); 
      if (threadError != 0) 
      { 
       NSLog(@"Thread error: %i", threadError); 
       // Report an error. 
      } 
     }); 
     //NSLog(@"index: %ld", index); 
     index = index + 4; 
    } 
} 

void* ThreadMethod(void *arg) 
{ 
    for (NSInteger loop = 0; loop < 4. ; loop++) { 
     NSInteger index = (NSInteger)arg + loop; 
     NSLog(@"index: %ld", index); 

     [AppDelegate.sharedAppDelegate.imageManager requestAVAssetForVideo:AppDelegate.sharedAppDelegate.assetsFetchResults[(NSInteger)index] options:AppDelegate.sharedAppDelegate.videoOptions resultHandler:^(AVAsset * _Nullable asset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) { 
      if(![[info objectForKey:PHImageResultIsInCloudKey] boolValue]) { 
       if (asset) { 
        NSError __autoreleasing *error = nil; 
        AVAssetReader *reader; 
        [reader = [AVAssetReader assetReaderWithAsset:asset error:&error] addOutput:[AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:[[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] outputSettings:@{(id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_32BGRA), (id)kCVPixelBufferWidthKey : @([[UIScreen mainScreen] bounds].size.width/(int)floor(sqrt([AppDelegate.sharedAppDelegate getAssetCount]))), (id)kCVPixelBufferHeightKey : @(([[UIScreen mainScreen] bounds].size.width/(int)floor(sqrt([AppDelegate.sharedAppDelegate getAssetCount]))) * (9.0/16.0))}]]; 
        [reader startReading]; 


        while ([reader status] != AVAssetReaderStatusReading) { } 
        if ([reader status] == AVAssetReaderStatusReading) { NSLog(@"reader %ld reading", index); } 
        else { NSLog(@"reader %ld NOT reading", index); } 
        DisplayLayer *displayLayer = (DisplayLayer *)[[AppDelegate.sharedAppDelegate consumers] objectForKey:[NSString stringWithFormat:@"%ld", (NSInteger)index]]; 
        dispatch_queue_t readerQueue = dispatch_queue_create([[NSString stringWithFormat:@"readerQueue %ld", (NSInteger)index] UTF8String], DISPATCH_QUEUE_SERIAL); 

        [displayLayer requestMediaDataWhenReadyOnQueue:readerQueue usingBlock:^{ 
         @autoreleasepool { 
          if ([reader status] == AVAssetReaderStatusReading) { 
           CMSampleBufferRef sampleBuffer = [[[reader outputs] firstObject] copyNextSampleBuffer]; 
           if (sampleBuffer) { 
            [displayLayer enqueueSampleBuffer:sampleBuffer]; 
            /*OSStatus err = CMSimpleQueueEnqueue(displayLayer.simpleBuffer, sampleBuffer); 
            if (err) { 
            NSLog(@"Producer %ld buffer error: %d", index, (int)err); 
            CMSimpleQueueReset(displayLayer.simpleBuffer); 
            }*/ 
            CFRelease(sampleBuffer); 
            sampleBuffer = nil; 
           } 
          } 
         } 
        }]; 
       } 
      } 
     }]; 
    } 
    return NULL; 
}