Для тех, кто не понял зачем это нужно std::mutex m;
void bad() { m.lock(); // определяем мьютекс f(); // если f() кинет исключение, то поток так и останется закрытым if(!everything_ok()) return; // если функция ретёрнится раньше unlock, то мьютекс тоже останется закрытым m.unlock(); // тут мьютекс разлочится }
void good() { std::lock_guard lk(m); // RAII class, обычный казалось бы мьютекс f(); // если f() кинет исключение, то мьютекс разлочится if(!everything_ok()) return; // если программа внезапно ретёрнится, то мьютекс разлочится } // и тут соответственное мьютекс разлочится как видите это просто безопаснее и гарантирует нормальную работу потоков
А нельзя сделать так ? Просто вызвать деструктор в нужном месте: mutex mtx; void Print(char ch) { this_thread::sleep_for(chrono::milliseconds(2000)); lock_guard guard(mtx); for (int i = 0; i < 5; ++i) { for (int j = 0; j < 10; ++j) { cout
Здравствуйте, Сергей! Скажите пожалуйста, у вас есть знания OpenGL? Будут ли уроки по данной теме? Заранее спасибо! Ваши уроки самые доступные, вы отличный преподаватель!
@@opencv1717 ну и совет, конечно, в опенгле-то днём с огнём еле разберешься, а ты про вулкан)) начинать со сложного а не с простого - проигрышная стратегия
Просто вместо Main.cpp создаете файл Main.c и пишете там свой сишный код. Студия "умная", сама поймет по расширению файла что нужен сишный компилятор. Ничего дополнительно устанавливать не нужно, танцев с бубном тоже.
Сергей, извините за странный вопрос, но обнаружилась любопытная деталь: при добавлении "sleep" (причём как и через chrono::milliseconds(2000), chrono::seconds(2), так и просто через sleep_for(2s)), иногда выходило так, что прямоугольники выводились в таком порядке: из *, из @, из #, или ещё в ином. Можно ли узнать причину такого странного "феномена" (: ? Заранее благодарю!
@@ДмитрийНормов-ю6ц Трабл в недостаточном количестве возможных потоков у компа скорее всего. Из-за чего комп сам выбирает, какой рапустить первый, то есть они не параллелятся
Смотрел смотрел, никак не могу придумать как создать треды в цикле, вот в мейне луп из 10 шагов например, на проце 24 ядра, каждый шаг вызывается член класса типо int DoWork(int,int) из n позиций если каждая функция цикла тяжёлая по вычислениям и нужно записать результат в некой массив. я пробую и получаю ub по моей логике надо создавать тред и джойнить сразу чтобы результат DoWork записался в ячейку массива. там же в цикле где он и создается итог линейное исполнение функции. может можно как-то массиву пометить mutable/vitable запустить в цикле 10 тредов std::thread( [&]() { result[i] = DoWork(x[i],y[i]); } а оно само там подождёт самую долгую операцию выполнив все быстрые в разных ядрах и продолжится стандартный ход main? Иначе как сказать процессу что он detach но при этом сделать lock прямо в моменте return из функции?
не очень понял нафига он если мы ограничиваем всю функцию тогда смысл в потоке ее вызывать а если ограничивать часть кода тогда мьютекс удобней ведь лок гард тоже нельзя забывать ограничивать
Сейчас бы где-то что-то вычитать и возгордиться этим. Курс для новичков. Сейчас рассказывать об RAII не имеет практической ценности и больше запутает людей.
*Cамый лучший способ сказать "спасибо" - поставить лайк и и поделиться уроком с друзьями. Это очень мотивирует создавать полезные уроки =)*
Я с тобой с самого начала и я очень удивлен ты очень хорошо объясняешь!
Для тех, кто не понял зачем это нужно
std::mutex m;
void bad()
{
m.lock(); // определяем мьютекс
f(); // если f() кинет исключение, то поток так и останется закрытым
if(!everything_ok()) return; // если функция ретёрнится раньше unlock, то мьютекс тоже останется закрытым
m.unlock(); // тут мьютекс разлочится
}
void good()
{
std::lock_guard lk(m); // RAII class, обычный казалось бы мьютекс
f(); // если f() кинет исключение, то мьютекс разлочится
if(!everything_ok()) return; // если программа внезапно ретёрнится, то мьютекс разлочится
} // и тут соответственное мьютекс разлочится
как видите это просто безопаснее и гарантирует нормальную работу потоков
Вот это всё проясняет, большое спасибо!
вот это реально респект!
#многопоточность #SimpleCode #урокипрограммирования
Спасибо большое за Ваш труд!!!
Одни из самых доступных и познавательных видео!
Очень разжевана информация, спасибо. После такого ролика невозможно не понять как это все работает.
Не закидывай канал только, очень интересные уроки
Расскажи про shared_mutex и unique_mutex
Просто класс. По моему мнению самый лучший канал по С++
Продолжай уроки по C++, мне так же крайне интересно!!
Очень полезный и интересный урок! Умоляем продолжить уроки по С++. Вы лучший!
Спасибо за урок, Сергей. Как всегда всё подаёшь доходчиво
Сергей спасибо за шикарные уроки.
Как всегда лайк, этот канал достоен наивысшего респекта
Сергей, спасибо большое за отличный урок!
Спасибо за урок!
Спасибо!)
Спасибо за ролик!
Большое спасибо за урок!
Спасибо за лекцию.
Спасибо большое!
Огромное, Спасибо !
Спасибо за урок.
Можно создать указатель на динамическую память под объект guard, и потом вызвать delete guard;
спасибо, ждём новые ролики
Спасибо!
Спасибо
когда Git будет? Умоляю
Спасибо за урок! И спасибо за хороший монтаж видео - экономит много времени при просмотре
*Л. а. й. к. о. с.* за видос.
А нельзя сделать так ? Просто вызвать деструктор в нужном месте:
mutex mtx;
void Print(char ch)
{
this_thread::sleep_for(chrono::milliseconds(2000));
lock_guard guard(mtx);
for (int i = 0; i < 5; ++i)
{
for (int j = 0; j < 10; ++j)
{
cout
Здравствуйте, Сергей!
Скажите пожалуйста, у вас есть знания OpenGL? Будут ли уроки по данной теме? Заранее спасибо! Ваши уроки самые доступные, вы отличный преподаватель!
OpenGL можно и самостоятельно попробовать осилить. А вот линейную алгебру нужную для его изучения я бы послушал от Сергея.
Если с нуля, то лучше Vulkan учить имхо. Все - таки за ним будущее
@@opencv1717 Вулкан учить не зная хотя бы немного OpenGL это пиздец.
@@opencv1717 ну и совет, конечно, в опенгле-то днём с огнём еле разберешься, а ты про вулкан)) начинать со сложного а не с простого - проигрышная стратегия
❤️
а почему порядок вывода символов поменялся?
Привет, скажи а можно использовать визулстудио для языка Си ?? а то при установки пакетов о Си там не слова. Нужны танцы с бубном или ???
Просто вместо Main.cpp создаете файл Main.c и пишете там свой сишный код. Студия "умная", сама поймет по расширению файла что нужен сишный компилятор. Ничего дополнительно устанавливать не нужно, танцев с бубном тоже.
нет, создавай файл кода как с при выборе с++
Сергей, извините за странный вопрос, но обнаружилась любопытная деталь: при добавлении "sleep" (причём как и через chrono::milliseconds(2000), chrono::seconds(2), так и просто через sleep_for(2s)), иногда выходило так, что прямоугольники выводились в таком порядке: из *, из @, из #, или ещё в ином. Можно ли узнать причину такого странного "феномена" (: ? Заранее благодарю!
ну как, разобрался?
@@ДмитрийНормов-ю6ц Трабл в недостаточном количестве возможных потоков у компа скорее всего. Из-за чего комп сам выбирает, какой рапустить первый, то есть они не параллелятся
а если бы функция Print возвращала значение где-то посередине с помощью return, то был бы ли вызван деструктор в этот момент?
Да
9:51 асинхронно =одновременно?
Смотрел смотрел, никак не могу придумать как создать треды в цикле, вот в мейне луп из 10 шагов например, на проце 24 ядра, каждый шаг вызывается член класса типо int DoWork(int,int) из n позиций если каждая функция цикла тяжёлая по вычислениям и нужно записать результат в некой массив. я пробую и получаю ub по моей логике надо создавать тред и джойнить сразу чтобы результат DoWork записался в ячейку массива. там же в цикле где он и создается итог линейное исполнение функции. может можно как-то массиву пометить mutable/vitable запустить в цикле 10 тредов std::thread( [&]() { result[i] = DoWork(x[i],y[i]); } а оно само там подождёт самую долгую операцию выполнив все быстрые в разных ядрах и продолжится стандартный ход main? Иначе как сказать процессу что он detach но при этом сделать lock прямо в моменте return из функции?
Отличный курс! Почему он бесплатный?!
потому что ШОК: не всё платное=хорошее и не всё хорошее=платное. лохи которые уравнивают эти вещи нередко оказываются обмануты разводилами))
Когда C#?
не очень понял нафига он если мы ограничиваем всю функцию тогда смысл в потоке ее вызывать а если ограничивать часть кода тогда мьютекс удобней ведь лок гард тоже нельзя забывать ограничивать
И ни слова про исключения и раскрутку стека, ну и что лок-гард реализует RAII. Или это слишком мудрено для целевой аудитории?
Сейчас бы где-то что-то вычитать и возгордиться этим. Курс для новичков. Сейчас рассказывать об RAII не имеет практической ценности и больше запутает людей.
@@0xMorgan , нет, чел прав, надо было бы упомянуть....
Спасибо
спасибо
спасибо