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

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

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

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

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

То есть проблема в том, что логи я вывожу в файл, а он одновременно может быть открыт только одним потоком
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2015, 01:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Синхронизация потоков (C++):

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

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

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

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

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

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

20
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,047
Записей в блоге: 17
01.08.2015, 12:42 #16
Я про:
Цитата Сообщение от Avazart Посмотреть сообщение
сделать асинхронную лок-фри запись
0
klynxe
11 / 11 / 4
Регистрация: 07.09.2012
Сообщений: 542
01.08.2015, 12:48  [ТС] #17
Цитата Сообщение от Avazart Посмотреть сообщение
std::lock_guard<std::mutex> lock(g_mutex);
Как понимаю, mutex работает также как и мой wait?
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
01.08.2015, 12:52 #18
Цитата Сообщение от klynxe Посмотреть сообщение
mutex работает также как и мой wait?
Нет. Мютекс исключает одновременный доступ из двух потоков, а твой случай - нет.
Например, может возникнуть ситуация когда несколько потоков одновременно закончат цикл
C++
1
while (wait){}
0
ct0r
Игогошка!
1776 / 678 / 42
Регистрация: 19.08.2012
Сообщений: 1,294
Завершенные тесты: 1
01.08.2015, 12:53 #19
Цитата Сообщение от Avazart Посмотреть сообщение
Я про:
И? Ты где-нибудь видел в стандарте или бусте АДЕКВАТНУЮ реализацию чего-нибудь лок-фри? Я нет. А почему? Потому что написать какое-нибудь обобщенное и ХОРОШЕЕ лок-фри, подходящее под большинство задач, нормально собираемое старыми компиляторами и нормально работающее на куче архитектур - невыполнимое дело. А асинхронность в той же самой лог-либе буста есть. Если тебе чем-то не нравится реализованная стандартными средствами библитека spdlog (интересно, а нестандартные это вообще какие?), то можешь написать свой вариант. Но факт остается фактом - чтобы получить максимальную производительность записи в лог, нужно использовать асинхронность и лок-фри очередь.
0
Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 127
01.08.2015, 12:54 #20
klynxe, нет, они работаю, как надо работать. Загуглите "Многопоточность", зайдите сразу на википедию и получите базовое представление, чтобы понять, что искать дальше.
0
klynxe
11 / 11 / 4
Регистрация: 07.09.2012
Сообщений: 542
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();
Подскажите, можно это как-то исправить?
Если можно это более рационально синхронизировать, то как?
0
02.08.2015, 03:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2015, 03:31
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Опции темы

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