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

Реализация работы с массивом только в одном потоке - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Описать класс, реализующий стек http://www.cyberforum.ru/cpp-beginners/thread562803.html
Очень нужна хоть какая-нибудь помощь! У меня никак не получается написать программу а заказывать времени уже нет. обратиться больше некуда. Вот задание: "Описать класс, реализующий стек. Написать программу, использующую этот класс для моделирования Т-образного сортировочного узла на железной дороге. Про* грамма должна разделять на два направления состав, состоящий из вагонов двух типов...
C++ Какая то гога с ЖЛовой либой Гога лезет от строки OpenGLContext=wglCreateContext(WindowContext); , выше есть #pragma comment(lib, "opengl32.lib") #pragma comment(lib, "glu32.lib")и HGLRC OpenGLContext; . А сама гога такая: Compiler: Default compiler Building Makefile: "C:\tsserver\Projects\cpp\dev\SeaJackals\Makefile.win" Executing make... http://www.cyberforum.ru/cpp-beginners/thread562782.html
C++ программа подсчитывающая число повторения в тексте
Доброго времени суток! Уважаемые участники форума, возникла следующая проблема: к данной задаче создать файл не получается из-за использования в ней функции, не компилируется , любой помощи буду благодарен Задача:Одним из способов идентификации автора литературного произведения – подсчет частоты вхождения отдельных слов. В заданном тексте найти 20 наиболее часто встречающихся слов с...
C++ Вычислить площадь круга для радиусов: r=5; r=10;r=15.
вычислить площадь круга для радиусов: r=5; r=10;r=15. вычислить площадь круга оформить в виде функции...заранее спасибо
C++ vector http://www.cyberforum.ru/cpp-beginners/thread562751.html
Объявляю двумерный массив следующим образом: vector< vector <int> > m_Mas; Как в таком случае нужно добавлять элементы и обращаться к ним?
C++ Создать класс Triad (тройка чисел); определить методы изменения полей и вычисления суммы чисел. Создать класс Triad (тройка чисел); определить методы изменения полей и вычисления суммы чисел. Определить производный класс Triangle с полями-сторонами. Определить методы вычисления углов и площади треугольника. подробнее

Показать сообщение отдельно
BigED
0 / 0 / 0
Регистрация: 14.12.2010
Сообщений: 26
01.05.2012, 19:15  [ТС]     Реализация работы с массивом только в одном потоке
По Вашей программе - вы сначала выделяете память под массив, строка 5. Потом этому же указателю присваиваете значение указателя из параметра, разумеется теряя указатель на только что выделенную память. Уже это странно как-то.
Не совсем понял что не так. Что бы воспользоваться параметром потока, пришлось немного помучатся, поскольку с первого раза не вышло. Во всяком случае именно в таком варианте, мне удалось передать массив, а не просто переменную.
А почему использование глобальной переменной "не вариант"?
Привык что за это "ругают", просто привык обходится без них, хотя согласен что это наиболее легкий вариант, если бы мне просто нужно было сделать хоть как-то
А поток создаете, передавая ему параметром какой-то array, непонятно как объявленный и проинициализированный...
Инициализация и обявление в мейне:
C++
1
2
    int *array=new int[20];
    for(int i=0;i<20;i++) array[i]=0;
В текущем его исполнении толку от него ноль, по моему - настолько быстро он проскочит
Не все учебные задачи имеют практический смысл

Добавлено через 23 минуты
Нашел ошибочку! Это была очень глупая опечатка во втором потоке, сейчас буду думать над синхронизацией

Добавлено через 2 часа 40 минут
Странно, в несколько модифицированном варианте функции потока оно работает как надо, но только в 9 из 10 запусках и я не могу никак понять почему:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
DWORD WINAPI Thread_1(LPVOID pParam)
{
    DWORD dwResult=0;
    int *array=new int[20]; 
    array=((int*)pParam); //я проверил, моя задумка работать с копией была несколько неверно реализованна, но это к лучшему - при работе с массивом в потоке, меняется и оригинал
    //cout<<"its work 1 !";
    for(int j=0;j<9;j++) 
    {
        while(flag!=0) //глобальный флаг потока (0- первый поток, 1-второй поток, 3-поток завершил работу)
        {
            Sleep(1); //ничего не делаем
            if (flag==3) //если можно, то делаем первый поток текущим и начинаем работать
            {
                flag=0;
            }
        }
        for(int i=0;i<20;i++) 
        {
            array[i]++; //инкрементируем массив (в потоке2 - декрементируем)
            cout<<array[i];
        }
        flag=3; //устанавливаем флаг возможности выбора начала работы другого потока
    
    }
 
    flag0=1; 
    return dwResult; 
}
Добавлено через 3 минуты
и почему-то в текущем варианте, в конце всегда массив нулевой, я объясняю это тем, что обоим потокам предоставляется одинаковое количество процессорного времени, я прав?
 
Текущее время: 09:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru