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

Синхронизация потоков - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Отправить POST запрос http://www.cyberforum.ru/cpp-beginners/thread1508052.html
Помогите уже, реально задолбался, 2 дня уже ищу рабочий код который бы отправлял пост запрос но никак не могу найти. Везде какие-то либы или паки исходников которые нужно проинсталлить, но даже после инсталла вроде бы код рабочий, но при компиляции выдает кучу ошибок а-ля "ссылка на неразрешенный внешний символ и т.п." Нашел для GET запроса - http://www.cyberforum.ru/post4743606.html . Автор...
C++ CMenu::InsertMenu - обработка сообщения Привет всем, Подскажите, пожалуйста, как обработать сообщение CMenu::InsertMenu посылаемое из внешнего приложения? Resource.h #define ID_EXPCATXML 100 Plugin.h http://www.cyberforum.ru/cpp-beginners/thread1508049.html
Как обратится к обьекту класса, являющегося наследником абстрактного класса C++
Здравствуйте! У меня есть 4 класса: один виртуальный, следующие 2 - наследуют виртуальный класс и последний класс содержит указатель на виртуальный класс (динамический массив, который растет от методов buildCar и buildTruck). eFuel - это также класс, который содержит еще класс, но в данном вопросе они не принимают участия. Вопрос: как через указатель четвертого класса доступится к наследующим...
C++ Линейный поиск в массиве структуры
Нужно с помощью линейного поиска искать в готовом массиве структуры значение вводимое с клавиатуры. Напишите шаблон , по которому это можно реализовать. Спасибо.
C++ Windows боксы (Окна, формы) http://www.cyberforum.ru/cpp-beginners/thread1508019.html
Приветствую уважаемые пользователи cyberforum! Сразу не знаю как правильно называется это. Но как можно реализовать окна на Windows?
C++ Не могу осознать причину ошибки Ну, в общем, читаю, такой, Страуструпа и прогаю малеху его примеры. Вот реализация одного из них: #include<iostream> char * strcpy1(char * dst, const char * src){ while (*dst++ = *src++) ; return dst; } int main() подробнее

Показать сообщение отдельно
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 538
02.08.2015, 03:31  [ТС]     Синхронизация потоков
Не совсем понимаю для чего нужны классы CSingleLock и CMultiLock и когда их нужно использовать
Есть такой пример
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
29
30
31
32
33
UINT MyThread1(LPVOID pParam);
    UINT MyThread2(LPVOID pParam);
    void CExampleView::OnStart() 
    {
        AfxBeginThread(MyThread1,this);
        AfxBeginThread(MyThread2,this); 
    }
    UINT MyThread1(LPVOID pParam)
    {
        CExampleView *ptrView=(CExampleView *)pParam; 
        CSingleLock syncObj(&(ptrView->sem));
        .......
        syncObj.Lock(); // получение семафора
        действия, связанные с доступом к ресурсу
 
        syncObj.Unlock(); // освобождение семафора
 
        .......
        return 0;
    }
    UINT MyThread2(LPVOID pParam)
    {
        CExampleView *ptrView=(CExampleView *)pParam; 
        CSingleLock syncObj(&(ptrView->sem));
        .......
        syncObj.Lock(); // получение семафора
        действия, связанные с доступом к ресурсу
 
        syncObj.Unlock(); // освобождение семафора
 
        .......
        return 0;
    }
Когда я использую mutex или критические секции принцип примерно как с wait, то есть заблокировал и жду разблокировки, а для чего еще и эти классы? В данном примере вроде и без них должно все работать?

Добавлено через 2 минуты
Как понимаю это аналоги lock_guard?

Добавлено через 2 часа 26 минут
И еще проблемка возникла
Использую чтение из потока как в этом примере
То есть читаю порт одним потоком как написано по ссылке выше

Все хорошо читает, пока я не пишу
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
CCriticalSection CriticalSectionGPSPoint;
DWORD __stdcall ReadThread(LPVOID hwnd)
 {
 DWORD iSize;
 char sReceivedChar; //переменная для хранения поступающих символов
String str; //переменная для хранения образующихся из символов строк
while (true) //в бесконечном цикле
{
ReadFile(hCom, &sReceivedChar, 1, &iSize, 0); //считываем из порта поступающие символы
 
if ((int)sReceivedChar == 10) //когда встречается символ конца строки
{
Form1->Memo1->Lines->Add(str); //добавляем новую строку в компонент Memo
 if (str.Pos("RMC")) //смотрим, если в строке содержится последовательность «RMC»
{
CriticalSectionGPSPoint.Lock();
ParseRMC(str);
CriticalSectionGPSPoint.Unlock();
} //то это необходимая нам строка. Вызываем функцию для ее разбора
str = ""; //очищаем переменную для заполнения ее символами новой строки
}
else
 {
 str = str + sReceivedChar; //если строка еще не сформирована, то просто прибавляем 
//поступающие с порта символы
}
 }
 }
То есть пока не использую синхронизацию CriticalSectionGPSPoint
С ней начинаются галюники чтения потока, в парсер попадают строки содержащие всякий бред (нереальные числа, склеенные сообщения, недопустимые символы и т.д.), то есть как понимаю, проблема в блокировке
А блокировку делаю для чего
Этим потоком в блокировке я записываю в парсере данные в объект
Другим потоком, вызываю
C++
1
2
3
CriticalSectionGPSPoint.Lock();
//читаю из объекта, в который писал из парсера
CriticalSectionGPSPoint.Unlock();
Подскажите, можно это как-то исправить?
Если можно это более рационально синхронизировать, то как?
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru