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

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

Восстановить пароль Регистрация
 
 
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 537
01.08.2015, 01:20     Синхронизация потоков #1
Есть статический класс к которому я хочу обращаться из разных потоков
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;
}
Будет такая моя синхронизация работать или нет?

То есть проблема в том, что логи я вывожу в файл, а он одновременно может быть открыт только одним потоком
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
01.08.2015, 01:23     Синхронизация потоков #2
Цитата Сообщение от klynxe Посмотреть сообщение
Будет такая моя синхронизация работать или нет?
Компилятор может для каждого потока для оптимизации поместить переменную wait в регистр.
Т.е. для каждого потока мы будем иметь свои независимые переменные wait, расположенные в одних и тех же регистрах, но на разных ядрах процессора к примеру.
Чтобы этого избежать, можно сказать компилятору не оптимизировать эту переменную, добавив ключевое слово volatile.
Но хорошим тоном было бы использование тут критических секций...
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 537
01.08.2015, 01:27  [ТС]     Синхронизация потоков #3
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Но хорошим тоном было бы использование тут критических секций...
А можно примерчик самый простой, а то чего в гугле все сложное(
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
01.08.2015, 01:33     Синхронизация потоков #4
Цитата Сообщение от klynxe Посмотреть сообщение
А можно примерчик
Вот примерчик под Windows.

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

Не по теме:

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

Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
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);
  //код вывода логов 
}
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 537
01.08.2015, 03:49  [ТС]     Синхронизация потоков #6
А как правильно синхронизировать доступ к переменной из разных потоков, одним пишу, вторым читаю?
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
01.08.2015, 04:12     Синхронизация потоков #7
Цитата Сообщение от klynxe Посмотреть сообщение
А как правильно синхронизировать доступ к переменной из разных потоков, одним пишу, вторым читаю?
https://www.lektorium.tv/lecture/15248

Добавлено через 3 минуты
Уильямс Э. "Параллельное программирование на С++ в действии. Практика разработки многопоточных программ" - 2012
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.08.2015, 11:53     Синхронизация потоков #8
Цитата Сообщение от Avazart Посмотреть сообщение
А вообще лучше просто завести два разных файла если есть возможность.
Единый файл лога нужен, чтобы понять последовательность действий: что за чем следует.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
01.08.2015, 11:59     Синхронизация потоков #9
Цитата Сообщение от Tulosba Посмотреть сообщение
Единый файл лога нужен, чтобы понять последовательность действий: что за чем следует.
Для потоков которые работают параллельно?
Т.е смысл в информации о последовательности действий которая по воле случая может меняться?
Мм что мешает делать временные "метки"?

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

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

Цитата Сообщение от Avazart Посмотреть сообщение
Просто если делать с блокировкой это будет узким местом и может повлиять,
Если нужно писать в один файл (не важно по какой причине: отладка или просто ведение журнала), то без механизмов синхронизации в любом случае не обойтись.
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
01.08.2015, 12:24     Синхронизация потоков #11
Цитата Сообщение от Avazart Посмотреть сообщение
Т.е смысл в информации о последовательности действий которая по воле случая может меняться?
Так это и хорошо, что будут меняться. Если например у нас баг в многопоточной среде, то это позволит выяснить, при какой же именно последовательности он происходит. Это куда удобнее, чем рыскать по куче файлов.

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

Цитата Сообщение от Avazart Посмотреть сообщение
Просто если делать с блокировкой это будет узким местом и может повлиять, на возможно, так ожидаемую производительность от использования потоков.
Всегда можно сделать асинхронную лок-фри запись, если есть необходимость. Высокопроизводительные логгирующие системы так и делают.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
01.08.2015, 12:26     Синхронизация потоков #12
Цитата Сообщение от ct0r Посмотреть сообщение
Всегда можно сделать асинхронную лок-фри запись, если есть необходимость. Высокопроизводительные логгирующие системы так и делают.
А можно пример?
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
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.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
01.08.2015, 12:35     Синхронизация потоков #14
Я думал как-то стандартными средствами, а ссылки на непонятные исходники на гид хабе ....
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
01.08.2015, 12:37     Синхронизация потоков #15
Цитата Сообщение от Avazart Посмотреть сообщение
Я думал как-то стандартными средствами, а ссылки на непонятные исходники на гид хабе ....
А тебе нужна поддержка ведения логов в стандарте? Ну удачи
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
01.08.2015, 12:42     Синхронизация потоков #16
Я про:
Цитата Сообщение от Avazart Посмотреть сообщение
сделать асинхронную лок-фри запись
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 537
01.08.2015, 12:48  [ТС]     Синхронизация потоков #17
Цитата Сообщение от Avazart Посмотреть сообщение
std::lock_guard<std::mutex> lock(g_mutex);
Как понимаю, mutex работает также как и мой wait?
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.08.2015, 12:52     Синхронизация потоков #18
Цитата Сообщение от klynxe Посмотреть сообщение
mutex работает также как и мой wait?
Нет. Мютекс исключает одновременный доступ из двух потоков, а твой случай - нет.
Например, может возникнуть ситуация когда несколько потоков одновременно закончат цикл
C++
1
while (wait){}
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
01.08.2015, 12:53     Синхронизация потоков #19
Цитата Сообщение от Avazart Посмотреть сообщение
Я про:
И? Ты где-нибудь видел в стандарте или бусте АДЕКВАТНУЮ реализацию чего-нибудь лок-фри? Я нет. А почему? Потому что написать какое-нибудь обобщенное и ХОРОШЕЕ лок-фри, подходящее под большинство задач, нормально собираемое старыми компиляторами и нормально работающее на куче архитектур - невыполнимое дело. А асинхронность в той же самой лог-либе буста есть. Если тебе чем-то не нравится реализованная стандартными средствами библитека spdlog (интересно, а нестандартные это вообще какие?), то можешь написать свой вариант. Но факт остается фактом - чтобы получить максимальную производительность записи в лог, нужно использовать асинхронность и лок-фри очередь.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2015, 12:54     Синхронизация потоков
Еще ссылки по теме:

Синхронизация потоков на семафорах C++
C++ Буферы и синхронизация потоков
Синхронизация потоков - уведомление о событии C++

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

Или воспользуйтесь поиском по форуму:
Eraston
 Аватар для Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 123
01.08.2015, 12:54     Синхронизация потоков #20
klynxe, нет, они работаю, как надо работать. Загуглите "Многопоточность", зайдите сразу на википедию и получите базовое представление, чтобы понять, что искать дальше.
Yandex
Объявления
01.08.2015, 12:54     Синхронизация потоков
Ответ Создать тему
Опции темы

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