12 / 12 / 4
Регистрация: 07.09.2012
Сообщений: 542
1

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

01.08.2015, 01:20. Показов 3145. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.08.2015, 01:20
Ответы с готовыми решениями:

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

Синхронизация потоков
Добрый день. Как синхронизировать потоки, чтобы вывод в stdout был поочередным: foo bar foo bar?...

Синхронизация потоков
Снова привет. Есть у меня код, который требуется раскидать на потоки. Ниже код: #include...

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

20
12 / 12 / 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.08.2015, 03:31
Помогаю со студенческими работами здесь

Синхронизация потоков - C++
Что это? Как это исправить? "ConsoleApplication2.exe" (Win32). Загружено...

Синхронизация процессов и потоков
Помогите с заданием, пожалуйста.

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru