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

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

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

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

01.08.2015, 01:20. Просмотров 737. Ответов 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;
}
Будет такая моя синхронизация работать или нет?

То есть проблема в том, что логи я вывожу в файл, а он одновременно может быть открыт только одним потоком
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2015, 01:20     Синхронизация потоков
Посмотрите здесь:

Синхронизация потоков в c++ - C++
Совершенно не понятно что не так и как правильно. Задача: Отсортировать массив целых чисел. Программу разбить на два синхронизированных...

синхронизация потоков - C++
проблема в следующем: есть 2 потока один считает некоторую сумму в цикле по столбцам матрицы второй должен выводить промежуточную...

Буферы и синхронизация потоков - C++
Всем привет. Суть такова: есть(будет) некая софтина которая подгружает плагины(дмнамические библиотеки) создает поток с функцией из этого...

Синхронизация потоков Event c++ - C++
Необходимо, чтобы нить t4 ждала события просчета времени "time = 1000 * (getTime() - time);" и после этого запускалась. Как реализовать?...

Синхронизация потоков на семафорах - C++
почему не работает синхронизация потоков на семафорах? при компиляции ошибка сегментирования. На мютексах работает корректно. Потоки...

Синхронизация потоков, события, WinAPI - C++
Уважаемые программисты! Решается такая задача: 5 потоков генерируют псевдослучайные числа, главный поток выводит их, при нажатии "enter"...

Синхронизация потоков - уведомление о событии - C++
Здравствуйте. Я хочу реализовать параллельную одновременную работу двух потоков, один из которых получает сообщения о событиях в...

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

Синхронизация потоков при работе с файлом - C++
Доброго времени суток! У меня такая проблема: многопоточные приложения я не писал ни разу, но, в целом, имею представление о них....

Синхронизация потоков ввода и вывода в Eclipce CDT - C++
Недавно перешел на программирование на Eclipse, но загвоздка в том, что если нужно ввести какое-то значение, то его ввод вызывается до...

Синхронизация - C++
Помогите, пожалуйста, в общих чертах рассказать про синхронизацию процессов на основе механизма обмена сообщениями. как это примерно должно...

синхронизация в windows - C++
есть два консольных приложения, родительского и дочернего процесса (должны ли они быть консольными), хочу обменяться между ними...

Синхронизация мьютекс - C++
Привет, на данный момент пытаюсь научиться пользоваться синхронизацией. Есть такой код: #include <iostream> #include <chrono> ...


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

Или воспользуйтесь поиском по форуму:
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 538
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     Синхронизация потоков
Ответ Создать тему
Опции темы

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