在C中的线程之间划分分配的内存

时间:2019-03-29 16:09:41

标签: c multithreading malloc

我有一些分配的内存,需要在线程之间进行分配。我在linux虚拟机上编写程序,并且使用pthreads。我不知道该怎么做。

例如,我为5个线程分配内存(每个线程2个int位置):

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

,我希望它们每个都将两个int值写入它们自己的内存部分。如果我有指向内存开始的指针,如何获得指向内存其他部分的指针?

1 个答案:

答案 0 :(得分:1)

这是一个简单的工作示例,使您可以执行此操作。一般的想法是创建一个线程,向它传递一个索引(它的id)。然后,您可以使用此ID限制对数组中特定索引的访问。

在下面的示例中,a是其元素在四个线程中求和的数组。 Thread0可以访问a [0:4],Thread1可以访问a [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; 
}