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



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

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

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

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

这是一个简单的工作示例,允许您执行此操作。一般的想法是创建一个线程,将索引(其 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; 
} 

最新更新