Разделите выделенную память между потоками в C - PullRequest
0 голосов
/ 29 марта 2019

У меня есть выделенная память, которую мне нужно разделить между потоками. Я пишу программу на виртуальной машине Linux и использую pthreads. Я не понимаю, как это сделать.

Например, я выделяю память для 5 потоков (2 int-места для каждого потока):

all_mem = (int*)malloc(5 * 2 * sizeof(int));

и я хочу, чтобы каждое из них записало два значения типа int в свою часть памяти. Если у меня есть указатель на начало памяти, как я могу получить указатель на какую-то другую часть памяти?

1 Ответ

1 голос
/ 29 марта 2019

Вот простой рабочий пример, который позволяет вам это сделать. Основная идея - создать поток, передать ему индекс (его идентификатор). Затем вы можете использовать этот идентификатор для ограничения доступа к определенным индексам в вашем массиве.

В приведенном ниже примере a - это массив, элементы которого суммируются в четыре потока. Thread0 может получить доступ к [0: 4], Thread1 может получить доступ к [4: 8], Thread2 a [8:12] и, наконец, Thread3 a [12:16]

#include <stdio.h>
#include <pthread.h> 

// size of array 
#define MAX 16 

// maximum number of threads 
#define MAX_THREAD 4 

int a[] = { 1, 5, 7, 10, 12, 14, 15, 18, 20, 22, 25, 27, 30, 64, 110, 220 }; 
int sum[] = { 0 , 0, 0, 0}; 

void* sum_array(void *arg) 
{
  int tid = *((int *)arg);
  for (int i = MAX_THREAD*tid; i < MAX_THREAD*tid + MAX/MAX_THREAD; i++) {
    printf("Thread %i is handling %i \n", tid, i);
    sum[tid] += a[i];
  }
} 

// Driver Code 
int main() 
{ 

    pthread_t threads[MAX_THREAD]; 

    // Creating 4 threads 
    for (int i = 0; i < MAX_THREAD; i++) {
      int *arg = malloc(sizeof(int));
      *arg = i;
      pthread_create(&threads[i], NULL, sum_array, (void*)arg); 
    }

    // joining 4 threads i.e. waiting for all 4 threads to complete 
    for (int i = 0; i < MAX_THREAD; i++) {
        pthread_join(threads[i], NULL);
    }

    // adding sum of all 4 parts 
    int total_sum = 0; 
    for (int i = 0; i < MAX_THREAD; i++) {
      total_sum += sum[i]; 
    }

    printf("sum is %i \n", total_sum); 

    return 0; 
} 
...