我有一些分配的内存,我需要在线程之间划分。我在 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;
}