我有一些分配的内存,需要在线程之间进行分配。我在linux虚拟机上编写程序,并且使用pthreads。我不知道该怎么做。
例如,我为5个线程分配内存(每个线程2个int位置):
all_mem = (int*)malloc(5 * 2 * sizeof(int));
,我希望它们每个都将两个int值写入它们自己的内存部分。如果我有指向内存开始的指针,如何获得指向内存其他部分的指针?
答案 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;
}