Добавление двух массивов не работает с помощью pthread

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

Справочная информация: тестовый код добавляет два массива, input1 и input2, и сохраняет результаты в выводе, используя 4 потока. Проблема заключалась в том, что один из потоков не мог сделать правильно, выходной буфер показывает "0" случайным образом для одного из потоков. Любая помощь высоко ценится.

#include<iostream>
#include<pthread.h>
#include<unistd.h>
using namespace std;
int input1[1000], input2[1000], output[1000]; 

void* Addition(void* offset) {
    int *local_offset = (int*)offset;
    for(int i = ((*local_offset) * 250); i < ((*local_offset)+1)*250; ++i) {
            output[i] = input1[i] + input2[i];
    }
    pthread_exit(0);
}

int main() {
    pthread_t thread_id[4];
    void* status;
    fill_n(input1, 1000, 3); // input1, fill the buffer with 3
    fill_n(input2, 1000, 4); // input2, fill the buffer with 4
    fill_n(output, 1000, 0); // output, fill the buffer with 0

    // create 4 thread with load of 250items
    for(int i = 0; i < 4; ++i) {
            int result = pthread_create(&thread_id[i], NULL, Addition, &i);
            if(result) cout << "Thread creation failed" << endl;
    }

    // join the 4-threads
    for(int i = 0; i < 4; ++i) {
            int result = pthread_join(thread_id[i], &status);
            if(result) cout << "Join failed " << i << endl;
    }

    // print output buffer, the output buffer not updated properly, 
    // noticed"0" for 1 & 2 thread randomly 
    for(int i =0; i < 1000; ++i)
            cout << i << " " << output[i] << endl;

    pthread_exit(NULL);
}

1 ответ

Я нашел основную причину проблемы... "&i" дает неизвестный результат, потому что память "i" будет перезаписана ++i, а thread_id[0] получит другое значение к тому времени, когда поток будет создан... так что вы должен иметь выделенную память, чтобы не было перезаписи ++i;

И это проблема...

int result = pthread_create(&thread_id[i], NULL, Addition, &i);

Чтобы решить, замените на &shared_data[i] .... int result = pthread_create(&thread_id[i], NULL, Addition, &shared_data[i]);

Shared_data представляет собой массив из 4 элементов.. как это

int shared_data[4] = {0,1,2,3};
Другие вопросы по тегам