Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

_beginthread - Race Condition в отсутствии оного - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Семантика массивов char. http://www.cyberforum.ru/cpp-beginners/thread518568.html
Добрый день. Мы все знаем, что в C и С++ создав два массива подрят.. запросив элемент привышающий размерность первого мы зайдем во второй. Так вот столкнулся со след проблемой в массивах типа char....
C++ UserFunction (Пользовательские функции) Дана матрица arrIn размера M на N, состоящая из целых чисел (int). M, N >= 8. Построить для нее матрицу arrOut такого же размера, элементы которой – числа с плавающей точкой (float) и равны Далее... http://www.cyberforum.ru/cpp-beginners/thread518517.html
C++ Сбор информации об оборудовании до загрузки ОС
Добрый день, форумчане. (в заголовке ошибся, речь идет о детекторе-антивирусе) В институте поставили такую вот оригинальную задачку: создать утилиту, которая размещается на флеш-накопителе и при...
C++ Найти сумма положительных элементов массива
здравствуйте! помогите написать программу на с++ с использованием класса. задание: в одномерном массиве состоящем из n элементов вычислить: 1.сумму положительных элементов массива...
C++ Распознавание нажатия клавиш http://www.cyberforum.ru/cpp-beginners/thread518502.html
Народ всем привет... Как осуществить на с++ такую вот прикалюху: при нажатии клавиши, например стрелочки в строковую переменную записываеться опредиленный мною символ... Заранее благодарен.)
C++ Разделение матрицы на подматрицы!! Матрицу (c любыми числами) разбить на 4 матрицы и вывести на екран.Заранее спасибо мужики. подробнее

Показать сообщение отдельно
DKOI
24 / 24 / 1
Регистрация: 08.09.2010
Сообщений: 136

_beginthread - Race Condition в отсутствии оного - C++

14.03.2012, 13:31. Просмотров 1255. Ответов 10
Метки (Все метки)

Неправильно обозвал тему Правильно - WaitForMultipleObject говорит что все потоки завершены, хотя есть ещё работающие.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void
thread(void * param)
{
    task_st * task = (task_st*) param;
    lexical_st * lx = &(task->lx);
    syntax_st * sx = &(task->sx);
    fseek(lx->stream, lx->start_pos,SEEK_SET);
    lex_cut(lx);
    for (;;) {
        t_token tmp = lexical(lx);
        if (tmp.token == TOKEN_END)
            break;
        parser(sx, &tmp);
    }
    task->is_done = 1;
    fclose(lx->stream);
    return;
}
C++
1
2
3
4
5
6
7
8
9
10
11
void
run_tasks(task_st task[], unsigned amount)
{
    HANDLE * threads = (HANDLE*) calloc(amount, sizeof(HANDLE));
    for (unsigned i = 0; i < amount; i++) {
        threads[i] = (HANDLE)_beginthread(thread, STACK_SIZE, &(task[i]));
    }
    WaitForMultipleObjects(amount, threads, TRUE, INFINITE);
    free(threads);
    return;
}
Так я запускаю потоки, которые должны выполнить свою часть работы и завершиться. Однако происходит какая-то ерунда и с увеличением количества потоков все меньший процент запусков происходит удачно. При последовательном запуске потоков с ожиданием завершения предыдущего, все работает нормально. Можно было бы подумать, что случается состояние гонки, но глобальные переменные, если и используются, то только для чтения (даже не переменная, а константный массив), а передаваемая в поток структура task уникальна для каждого потока и более нигде не используется. Самое интересное, что суть в том, что есть ещё не завершенные поток, а функция ожидания говорит, что все завершены. Если же переписать ожидание самому
C++
1
2
3
4
5
6
7
    for(;;) {
        unsigned int i, k = 0;
        for (i = 0; i < amount; i++) {
            k += task[i].is_done;
        }
        if (k == amount) break;
    }
то все работает отлично.
В чем может быть причина такого странного поведения?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru