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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 537
#1

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

01.08.2015, 01:20. Просмотров 682. Ответов 20
Метки нет (Все метки)

Есть статический класс к которому я хочу обращаться из разных потоков
C++
1
2
3
4
5
static class MyLog
{
public:
    static int log(std::string, int type);
};
Внутри написал так
C++
1
2
3
4
5
6
7
8
9
bool wait;
int MyLog::log(std::string data, int type)
{
        while (wait){}
        wait = true;
//код вывода логов
        wait = false;
        return 0;
}
Будет такая моя синхронизация работать или нет?

То есть проблема в том, что логи я вывожу в файл, а он одновременно может быть открыт только одним потоком
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2015, 03:31     Синхронизация потоков
Еще ссылки по теме:

Синхронизация мьютекс C++
Синхронизация потоков ввода и вывода в Eclipce CDT C++
C++ синхронизация потоков
Синхронизация потоков Event c++ C++
C++ Синхронизация процессов

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 537
02.08.2015, 03:31  [ТС]     Синхронизация потоков #21
Не совсем понимаю для чего нужны классы 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();
Подскажите, можно это как-то исправить?
Если можно это более рационально синхронизировать, то как?
Yandex
Объявления
02.08.2015, 03:31     Синхронизация потоков
Ответ Создать тему
Опции темы

Текущее время: 09:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru