Как сбросить список в память после изменения потоком в OpenMP - PullRequest
1 голос
/ 12 апреля 2019

У меня есть список, который разделен между двумя потоками на OpenMP. Список передается как ссылка на внешнюю функцию, вызываемую каждым потоком. В функции каждый поток сгенерирует личный список, заблокирует общий список, объединит личный список с общим списком с помощью splice (). Я использовал omp_lock_t, когда splice () происходит в каждом потоке, но итоговый общий список после завершения двух потоков не корректен, как если бы другой поток не видел изменений, внесенных в общий список текущим потоком. Что мне делать?

int main(int argc, char** argv)
{
    list<string> shared_list;
    omp_lock_t l0;
    omp_init_lock(&l0);

    #pragma omp parallel num_threads(2)
    {
        external_function(shared_list, &l0);
    }
}


external function(list<string>& shared_list, omp_lock_t* l0)
{
    list<string> local_list;

    for (int i = 0; i < 10; i++)
    {
        local_list.push_back("Aloha");
    }

    omp_set_lock(l0);
    shared_list.splice(shared_list.end(), local_list);
    omp_unset_lock(l0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...