Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2019, 07:04   #1
Tpai
 
Регистрация: 09.06.2018
Сообщений: 9
Сообщение переменная используется несколькими потоками

У меня переменная adt2[0] используется 4 потоках. Сама она равна изначально 4. Каждый поток уменьшает её на 1 (104 строка). Тем не менее все потоки зацикливаются в цикле в 107 строке. Хотя, к тому моменту, когда все они доходят до туда, переменная adt2[0] должна быть равна 0, что должно приводить к завершению цикла. А она равна 1.
Код:
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <array>
#include <thread>
#include <chrono>
#include <thread>
#include <cmath>
#include <mutex>
using namespace std;
template <class T> class my_array;
template <class T>
void vn(int k, int n, my_array<T>& th);
template <class T> class my_array {
    vector <T> veca;
    int adt;
    int gr;
    mutex g;
    thread ** te;
    int * adt2;
public:
    my_array(vector<T> veca1) {
        veca = veca1;
        gr = veca.size();
        adt = gr / 2;
        te = new thread*[adt];
        adt2 = new int[log2(adt)];
        for (int adt3 = adt, i = 0; adt3 > 1; adt3 /= 2, i++) {
            adt2[i] = adt3;
        }
    };
    friend void vn <>(int k, int n, my_array<T>& th);
    void shelly(void) {
        int i = 0;
        int adt1 = adt;
        int j;
        int k;
        for (j = adt1 / 2 + adt1 % 2, k = 1; adt1 > 1; adt1 /= 2, j += adt1 / 2 + adt1 % 2, k++) {//исправить
            for (; i < j; i++) {
                te[i] = new thread(vn<T>, adt - i - 1, k, ref(*this));
            }
        }
        te[adt - 1] = new thread(vn<T>, 0, k - 1, ref(*this));
        for (i = 0; i < adt; i++) {
            te[i]->join();
        }
        for (i = 0; i < adt; i++) {
            delete te[i];
        }
        k = 1;
        T t;
        for (int i = k; i < gr; i++)
        {
        t = veca[i];
        for (j = i; j >= k; j -= k)
        {
        if (t < veca[j - k])
        veca[j] = veca[j - k];
        else
        break;
        }
        veca[j] = t;
        }
    };
    void schell(void) {
        int i, j, k;
        T t;
        for (k = gr / 2; k > 0; k /= 2)
            for (i = k; i < gr; i++)
            {
                t = veca[i];
                for (j = i; j >= k; j -= k)
                {
                    if (t < veca[j - k])
                        veca[j] = veca[j - k];
                    else
                        break;
                }
                veca[j] = t;
            }
    };
    ~my_array() {
        delete[] te;
    };
};
template <class TT> void vn(int b, int n, my_array<TT>& th)
{
    int j, i;
    TT t;
    int k = th.adt;
    for (i = k + b; i < th.gr; i += k)
    {
        t = th.veca[i];
        for (j = i; j >= k; j -= k)
        {
            if (t < th.veca[j - k])
                th.veca[j] = th.veca[j - k];
            else
                break;
        }
        th.veca[j] = t;
    }
    th.g.lock();
    th.adt2[0]--;
    th.g.unlock();
    for (k /= 2, i = 1; i < n; k /= 2, i++) {
        while (1) {
            th.g.lock();
            if (th.adt2[i - 1] == 0)
                break;
            th.g.unlock();
        }
        for (i = k + b; i < th.gr; i += k)
        {
            t = th.veca[i];
            for (j = i; j >= k; j -= k)
            {
                if (t < th.veca[j - k])
                    th.veca[j] = th.veca[j - k];
                else
                    break;
            }
            th.veca[j] = t;
        }
        th.g.lock();
        th.adt2[i]--;
        th.g.unlock();
    }
}
int main()
{
    vector <double> oba = { 9.8, 8.33, 4.77, 8.77, 5.94, 4.11, 3.654, 666.888 };
    my_array <double> jhu(oba);
    jhu.schell();
    jhu.shelly();
    return 0;
}
Tpai вне форума Ответить с цитированием
Старый 29.03.2019, 10:18   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Код:
            th.g.lock();
            if (th.adt2[i - 1] == 0)
                break;
            th.g.unlock();
А кто здесь будет мьютекс отпирать?
waleri вне форума Ответить с цитированием
Старый 29.03.2019, 10:39   #3
Tpai
 
Регистрация: 09.06.2018
Сообщений: 9
По умолчанию

А разве
Код:
 th.g.unlock();
Не отпирает mutex?

Upd: всё, я понял
Tpai вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Генерация случайных чисел несколькими потоками OpenMP drako08 Общие вопросы C/C++ 0 18.03.2018 17:33
Где используется c++? Мой повелитель Общие вопросы C/C++ 3 21.04.2016 23:30
Используется ли тут PHP? NetSpace HTML и CSS 3 22.03.2015 18:57
Скачивание файла в несколькими потоками Fok Работа с сетью в Delphi 3 24.01.2012 18:28
Устройство ещё используется. nusik Фриланс 1 09.12.2009 15:02