Вот простой рабочий пример, который позволяет вам это сделать. Основная идея - создать поток, передать ему индекс (его идентификатор). Затем вы можете использовать этот идентификатор для ограничения доступа к определенным индексам в вашем массиве.
В приведенном ниже примере 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;
}