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

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

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

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

01.08.2015, 01:20. Просмотров 736. Ответов 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++
Здравствуйте. Я хочу реализовать параллельную одновременную работу двух потоков, один из которых получает сообщения о событиях в...

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

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

Не по теме:

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

Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,279
Записей в блоге: 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
Сообщений: 538
01.08.2015, 03:49  [ТС]     Синхронизация потоков #6
А как правильно синхронизировать доступ к переменной из разных потоков, одним пишу, вторым читаю?
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,279
Записей в блоге: 17
01.08.2015, 04:12     Синхронизация потоков #7
Цитата Сообщение от klynxe Посмотреть сообщение
А как правильно синхронизировать доступ к переменной из разных потоков, одним пишу, вторым читаю?
https://www.lektorium.tv/lecture/15248

Добавлено через 3 минуты
Уильямс Э. "Параллельное программирование на С++ в действии. Практика разработки многопоточных программ" - 2012
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
01.08.2015, 11:53     Синхронизация потоков #8
Цитата Сообщение от Avazart Посмотреть сообщение
А вообще лучше просто завести два разных файла если есть возможность.
Единый файл лога нужен, чтобы понять последовательность действий: что за чем следует.
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,279
Записей в блоге: 17
01.08.2015, 11:59     Синхронизация потоков #9
Цитата Сообщение от Tulosba Посмотреть сообщение
Единый файл лога нужен, чтобы понять последовательность действий: что за чем следует.
Для потоков которые работают параллельно?
Т.е смысл в информации о последовательности действий которая по воле случая может меняться?
Мм что мешает делать временные "метки"?

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

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

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

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

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

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

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

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

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

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


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

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

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