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

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

01.08.2015, 01:20. Показов 3031. Ответов 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
1386 / 1016 / 323
Регистрация: 28.07.2012
Сообщений: 2,804
01.08.2015, 01:23 2
Цитата Сообщение от klynxe Посмотреть сообщение
Будет такая моя синхронизация работать или нет?
Компилятор может для каждого потока для оптимизации поместить переменную wait в регистр.
Т.е. для каждого потока мы будем иметь свои независимые переменные wait, расположенные в одних и тех же регистрах, но на разных ядрах процессора к примеру.
Чтобы этого избежать, можно сказать компилятору не оптимизировать эту переменную, добавив ключевое слово volatile.
Но хорошим тоном было бы использование тут критических секций...
0
12 / 12 / 4
Регистрация: 07.09.2012
Сообщений: 542
01.08.2015, 01:27  [ТС] 3
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Но хорошим тоном было бы использование тут критических секций...
А можно примерчик самый простой, а то чего в гугле все сложное(
0
1386 / 1016 / 323
Регистрация: 28.07.2012
Сообщений: 2,804
01.08.2015, 01:33 4
Цитата Сообщение от klynxe Посмотреть сообщение
А можно примерчик
Вот примерчик под Windows.

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от klynxe Посмотреть сообщение
чего в гугле все сложное(
o_O
Ничего сложного, просто набор функций для создания, удаления, входа и выхода из критической секции.

0
Эксперт С++
8382 / 6144 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.08.2015, 02:38 5
http://ru.cppreference.com/w/cpp/thread/mutex
http://habrahabr.ru/post/182610/

А вообще лучше просто завести два разных файла если есть возможность.

Добавлено через 2 минуты
C++
1
2
3
4
5
int MyLog::log(std::string data, int type) 
{ 
  std::lock_guard<std::mutex> lock(g_mutex);
  //код вывода логов 
}
0
12 / 12 / 4
Регистрация: 07.09.2012
Сообщений: 542
01.08.2015, 03:49  [ТС] 6
А как правильно синхронизировать доступ к переменной из разных потоков, одним пишу, вторым читаю?
0
Эксперт С++
8382 / 6144 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.08.2015, 04:12 7
Цитата Сообщение от klynxe Посмотреть сообщение
А как правильно синхронизировать доступ к переменной из разных потоков, одним пишу, вторым читаю?
https://www.lektorium.tv/lecture/15248

Добавлено через 3 минуты
Уильямс Э. "Параллельное программирование на С++ в действии. Практика разработки многопоточных программ" - 2012
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
01.08.2015, 11:53 8
Цитата Сообщение от Avazart Посмотреть сообщение
А вообще лучше просто завести два разных файла если есть возможность.
Единый файл лога нужен, чтобы понять последовательность действий: что за чем следует.
1
Эксперт С++
8382 / 6144 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.08.2015, 11:59 9
Цитата Сообщение от Tulosba Посмотреть сообщение
Единый файл лога нужен, чтобы понять последовательность действий: что за чем следует.
Для потоков которые работают параллельно?
Т.е смысл в информации о последовательности действий которая по воле случая может меняться?
Мм что мешает делать временные "метки"?

Просто если делать с блокировкой это будет узким местом и может повлиять, на возможно, так ожидаемую производительность от использования потоков.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
01.08.2015, 12:20 10
Цитата Сообщение от Avazart Посмотреть сообщение
Для потоков которые работают параллельно?
Именно. Логи часто используются для отладки. И суть такого лога в первую очередь показать последовательность действий (прохода контрольных точек) чтобы в дальнейшем разобраться что не так.

Цитата Сообщение от Avazart Посмотреть сообщение
что мешает делать временные "метки"?
Как минимум, неудобство просмотра нескольких файлов вместо одного.

Цитата Сообщение от Avazart Посмотреть сообщение
Просто если делать с блокировкой это будет узким местом и может повлиять,
Если нужно писать в один файл (не важно по какой причине: отладка или просто ведение журнала), то без механизмов синхронизации в любом случае не обойтись.
1
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
01.08.2015, 12:24 11
Цитата Сообщение от Avazart Посмотреть сообщение
Т.е смысл в информации о последовательности действий которая по воле случая может меняться?
Так это и хорошо, что будут меняться. Если например у нас баг в многопоточной среде, то это позволит выяснить, при какой же именно последовательности он происходит. Это куда удобнее, чем рыскать по куче файлов.

Цитата Сообщение от Avazart Посмотреть сообщение
Мм что мешает делать временные "метки"?
Их и так надо делать всегда.

Цитата Сообщение от Avazart Посмотреть сообщение
Просто если делать с блокировкой это будет узким местом и может повлиять, на возможно, так ожидаемую производительность от использования потоков.
Всегда можно сделать асинхронную лок-фри запись, если есть необходимость. Высокопроизводительные логгирующие системы так и делают.
1
Эксперт С++
8382 / 6144 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.08.2015, 12:26 12
Цитата Сообщение от ct0r Посмотреть сообщение
Всегда можно сделать асинхронную лок-фри запись, если есть необходимость. Высокопроизводительные логгирующие системы так и делают.
А можно пример?
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
01.08.2015, 12:28 13
Вообще я бы не городил свой велосипед и просто взял что-нибудь нормальное готовое.
Типа https://github.com/gabime/spdlog например.

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
А можно пример?
О, как раз пример и привел - spdlog:
Extremely fast asynchronous mode (optional) - using lockfree queues and other tricks to reach millions of calls/sec.
0
Эксперт С++
8382 / 6144 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.08.2015, 12:35 14
Я думал как-то стандартными средствами, а ссылки на непонятные исходники на гид хабе ....
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
01.08.2015, 12:37 15
Цитата Сообщение от Avazart Посмотреть сообщение
Я думал как-то стандартными средствами, а ссылки на непонятные исходники на гид хабе ....
А тебе нужна поддержка ведения логов в стандарте? Ну удачи
0
Эксперт С++
8382 / 6144 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.08.2015, 12:42 16
Я про:
Цитата Сообщение от Avazart Посмотреть сообщение
сделать асинхронную лок-фри запись
0
12 / 12 / 4
Регистрация: 07.09.2012
Сообщений: 542
01.08.2015, 12:48  [ТС] 17
Цитата Сообщение от Avazart Посмотреть сообщение
std::lock_guard<std::mutex> lock(g_mutex);
Как понимаю, mutex работает также как и мой wait?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
01.08.2015, 12:52 18
Цитата Сообщение от klynxe Посмотреть сообщение
mutex работает также как и мой wait?
Нет. Мютекс исключает одновременный доступ из двух потоков, а твой случай - нет.
Например, может возникнуть ситуация когда несколько потоков одновременно закончат цикл
C++
1
while (wait){}
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
01.08.2015, 12:53 19
Цитата Сообщение от Avazart Посмотреть сообщение
Я про:
И? Ты где-нибудь видел в стандарте или бусте АДЕКВАТНУЮ реализацию чего-нибудь лок-фри? Я нет. А почему? Потому что написать какое-нибудь обобщенное и ХОРОШЕЕ лок-фри, подходящее под большинство задач, нормально собираемое старыми компиляторами и нормально работающее на куче архитектур - невыполнимое дело. А асинхронность в той же самой лог-либе буста есть. Если тебе чем-то не нравится реализованная стандартными средствами библитека spdlog (интересно, а нестандартные это вообще какие?), то можешь написать свой вариант. Но факт остается фактом - чтобы получить максимальную производительность записи в лог, нужно использовать асинхронность и лок-фри очередь.
0
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
01.08.2015, 12:54 20
klynxe, нет, они работаю, как надо работать. Загуглите "Многопоточность", зайдите сразу на википедию и получите базовое представление, чтобы понять, что искать дальше.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2015, 12:54
Помогаю со студенческими работами здесь

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

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

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

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


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

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

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