При компиляции и исполнении кода иногда выскакивает ошибка

197
27 января 2020, 22:40

Суть кода - задаётся число N. Создаётся N потоков (помимо основного), которые анализируют поток байтов. И каждый поток выдаёт структуру в очередь структур.

И ошибка вылазит только при N > 1.

    struct nal_anal 
{
    int number;
    int type;
    int size;
    int M;
};
void analys(uint16_t nal_head, uint16_t numb, int min, int max, queue<nal_anal> &exit){
    nal_anal nal;
    nal.number = numb;
    nal.M = rand() % min + (max - min);
    nal.type = (nal_head & 0x7fff) >> 9;
    nal.size = sizeof(nal_head);
    this_thread::sleep_for(chrono::milliseconds(nal.M));
    exit.emplace(nal);
    cout << "Thread ID: " << this_thread::get_id() << "\t" << nal.number << endl;
    cout << "Обработанный НАЛ юнит:\t" << bitset<16>(nal_head) << "\tНомер \t" << numb << endl;
    }
    int main(){
    setlocale(LC_ALL, "ru");
    srand(time(NULL));
    string path = "video.mkv";
    queue<nal_anal> q;
    int N;
    int MIN = 500, MAX = 500;
    int T = 1;
    cout << "Введите N: " << endl;
    cin >> N;
    vector<thread> threads(N);
    ifstream mkv;
    mkv.open(path, fstream::binary);
    if (!mkv.is_open())
    {
        cout << "Not" << endl;
    }
    else
    {
        cout << "Success!" << endl;
        uint32_t numb = 1; //Порядок считать с первого номера
        for (int i = 0; i < 3; i++)
        {
            unsigned char byte;
            uint16_t nal;
            mkv >> byte;
            nal = static_cast<uint16_t>(byte);
            mkv >> byte;
            nal = (nal << 8) | static_cast<uint16_t>(byte);
            analys(nal, numb, MIN, MAX, ref(q));
            //cout << "Обработанный НАЛ юнит:\t" << bitset<16>(nal) << "\tНомер \t" << numb << endl;
            numb++;
            for (unsigned i = 0; i < N; ++i)
            {
                mkv >> byte;
                nal = static_cast<uint16_t>(byte);
                mkv >> byte;
                nal = (nal << 8) | static_cast<uint16_t>(byte);
                threads[i] = thread(analys, nal, numb, MIN, MAX, ref(q));
                numb++;
            }
            for (unsigned i = 0; i < N; ++i)
                threads[i].join();
        }

        if (q.empty())
        {
            cout << "empty" << endl;
        }
        else
        {
            cout << "full" << endl;
        }
        while (!q.empty())
        {
            cout << "Number: \t" << q.front().number << endl;
            cout << "Type: \t" << bitset<6>(q.front().type) << endl;
            cout << "Size: \t" << q.front().size << endl;
            cout << "M: \t" << q.front().M << endl;
            q.pop();
        }

В чём может быть проблема? И непостоянство проявления.

Answer 1

Ваш код разрушает целостность внутренних структур динамической памяти. Как правило, это вызывается либо записью за пределы выделенной памяти (за пределы массива и т.п.), либо (реже) записью через некорректный указатель, либо попытками "освободить" память, которую вы не выделяли динамически.

"Непостоянство проявления" - нормальное явление в таких случаях. Может быть связано с непостоянством расположения блоков в памяти, а может быть - с каким-то "непостоянством" из вашего кода.

Answer 2

В коде масса проблем:

  • файл открывается в бинарном режиме, но чтение из него производится как из текстового
  • успешность чтения никогда не проверяется
  • бессмысленное создание потоков в цикле
  • потоки обращаются к переменной queue<nal_anal> q; без синхронизации, что приводит к Неопределенному Поведению
READ ALSO
undefined reference to `Magick::Image::Image()&#39;

undefined reference to `Magick::Image::Image()'

Подскажите, чего не хватает?

217
std::thread join - виснет [закрыт]

std::thread join - виснет [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос, чтобы он соответствовал тематике «Stack Overflow на русском»

175
Причем здесь лямбда?

Причем здесь лямбда?

Анонимные делегаты в Java 8 не являются лямбда-выражениями, тк

202