Как найти общие значения из двух массивов с помощью pthread

#c #multithreading #pthreads

#c #многопоточность #pthreads

Вопрос:

 #include <stdio.h>
#include <pthread.h>

#define MAX_THREAD 4

long long int arr1[100];
long long int arr2[100];

int n,m;
int part = 0;

void* array_search(void* arg){

    int thread_part = part  ;

    //printf("%dn",thread_part);

    if(part==4)
    {
        for(int i = thread_part *(n/4) ; i < n ; i  ){
            for(int j = thread_part*(m/4) ; j < m;j  ){
                if(arr1[i] == arr2[j]){
                    printf("%lldn", arr1[i]);
                }
            }
        }
    }
    else{
        for(int i = thread_part *(n/4) ; i < ((thread_part   1) *(n/4)) ; i  ){
            for(int j = thread_part*(m/4) ; j < ((thread_part   1) *(m/4));j  ){
                if(arr1[i] == arr2[j]){
                    printf("%lldn", arr1[i]);
                }
            }
        }
    }   
}

int main()
{
    printf("Enter the element in First Array:");
    scanf("%d", amp;n);

    for(int i = 0 ; i < n; i  ){
        scanf("%lld",amp;arr1[i]);
    }   
    printf("Enter the element in Second Array:");
    scanf("%d", amp;m);
    for(int i = 0 ; i < m; i  ){
        scanf("%lld",amp;arr2[i]);
    }
    pthread_t thread[MAX_THREAD];
    for (int i = 0; i < MAX_THREAD; i  ){
        pthread_create(amp;thread[i], NULL, array_search, (void*)NULL); 
    } 
    for (int i = 0; i < MAX_THREAD; i  ){
        pthread_join(thread[i], NULL); 
    }
            
    return 0;
}
  

На самом деле в моем коде есть проблема. Когда я ввожу следующий ввод, он ничего не выводит. Я не понимаю, почему это происходит.

 Enter the element in First Array:3
2000 4000 5000 
Enter the element in Second Array:4
2000 70000 40000 300000
(no output here)
  

Комментарии:

1. У вас происходит гонка данных part . Не уверен, чего if(part==4) ... else .. предполагается достичь. Что еще более важно, нужно ли использовать потоки для решения этой проблемы? 🙂

2. Да, part ==4 говорит, что все потоки запущены, но часть модифицирована потоками, не защищена мьютексом и поэтому может быть повреждена. Ваши диапазоны for не заканчиваются на производных значениях thread_part. Если вы сравниваете первую 1/4 a с первой 1/4 b, вы проверяете 1/16 возможностей.

3. я добавляю часть == 4, потому что для последнего потока я должен рассмотреть все элементы в массиве

4. но я не понимаю, что вы пытаетесь сказать, можете ли вы объяснить это более подробно