Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 [6]      все
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик
Dima T
Я ссылки давал выше 22304501, почитал? Почитай хотя бы статью на хабре.

обязательно прочитаю, но позже.
Так я и написал, что не залочится. Это то я понимаю. Я не понимаю, зачем мне мутекс в таком случае...
Надеюсь хабр даст ответ.

Метод в векторе Добавить сначала запишет объект а потом увеличит счетчик Count.
Если два потока сразу, то эти две строки пемешаются.
Райзе будет.
Так понятно?
5 апр 21, 16:24    [22304623]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
Еще про fairness не говорили.
5 апр 21, 16:25    [22304624]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,
Шо будет если строки перемешать?))))
public void deleteLast(Vector list) {
    int lastIndex = list.size() - 1;
    list.remove(lastIndex);

Давай уж код начнем писать)))
5 апр 21, 16:34    [22304629]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton,
Самый простой способ Не блокирования это клонирование коллекции или ее куска.
Широко применяется. Нет никаких особых последствий.
И никаких мьютексов.
5 апр 21, 16:41    [22304641]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
А я предлагаю обсудить кто первый получит доступ к g_mutex после того как самый первый поток его отпускает.

{
   // in thread 1
   lock(g_mutex);
   // very long action
   unlock(g_mutex);
}



{
   // in thread 2
   lock(g_mutex);
}


{
   // in thread 3
   lock(g_mutex);
}
5 апр 21, 16:42    [22304643]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
PetroNotC Sharp
бабушкин зайчик
пропущено...

обязательно прочитаю, но позже.
Так я и написал, что не залочится. Это то я понимаю. Я не понимаю, зачем мне мутекс в таком случае...
Надеюсь хабр даст ответ.

Метод в векторе Добавить сначала запишет объект а потом увеличит счетчик Count.
Если два потока сразу, то эти две строки пемешаются.
Райзе будет.
Так понятно?

мне это не поможет, коли от кэша зависит, кто там первый встал того и тапки
мы имеем "старые данные" И "новые данные", т.е. один поток был раньше другого
а вот какие именно попадут в ячейку...

Я тут придумал вот чё: а шо если держать несколько ф-й, каждая из которых пишет в диапазон ячеек...
ф1 = 0-9999
ф2 = 10000-19999
(you got the idea)
И вот ИХ лочить?

Сообщение было отредактировано: 5 апр 21, 16:40
5 апр 21, 16:45    [22304647]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
бабушкин зайчик


Я тут придумал вот чё: а шо если держать несколько ф-й, каждая из которых пишет в диапазон ячеек...
ф1 = 0-9999
ф2 = 10000-19999
you got the idea.
И вот ИХ лочить?


Не надо их лочить. Это идеальный параллелизм. Shared Nothing. Только в конце работы тебе надо сделать ::join()
всех потоков чтобы убедится что корректировок массива уже не будет.

И не забывай про DWORD/ia32.
5 апр 21, 16:49    [22304653]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,
В java лочатся все публичные методы для вектора с названием фабричного метода Collections.synchronizedXxxxx
Но есть и штук 30 других коллекций.
...
Если диапазон, то лочить не надо. Каждому потоку по тарелке
5 апр 21, 16:53    [22304656]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
mayton
Это идеальный параллелизм. Shared Nothing.

ну вообще-то шанс то остаётся, что 2 потока залезут в одну ячейку
5 апр 21, 17:00    [22304657]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
ТС, идите в..... Qt!
Чем вы будете лисапед писать первый раз в жизни.
автор
QtConcurrent имен предоставляет API - интерфейсы высокого уровня , которые делают возможным написание многопоточных программ без использования низкоуровневых поточных примитивов , таких как мьютексы, блокировки чтение-запись, условия ожидания или семафоры. Программы, написанные с помощью QtConcurrent, автоматически регулируют количество используемых потоков в соответствии с количеством доступных ядер процессора. Это означает, что приложения, написанные сегодня, будут продолжать масштабироваться при развертывании в многоядерных системах в будущем.
5 апр 21, 17:01    [22304658]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
бабушкин зайчик
mayton
Это идеальный параллелизм. Shared Nothing.

ну вообще-то шанс то остаётся, что 2 потока залезут в одну ячейку

Мне бабушка говорила
- Не ешь с пола.
- Одевай зимой шерстяные штаны.
- И выравнивай доступ к памяти по регистру.
5 апр 21, 17:02    [22304659]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
mayton
- И выравнивай доступ к памяти по регистру.

хм?
PetroNotC Sharp
ТС, идите в..... Qt!
Чем вы будете лисапед писать первый раз в жизни.
автор
QtConcurrent имен предоставляет API - интерфейсы высокого уровня , которые делают возможным написание многопоточных программ без использования низкоуровневых поточных примитивов , таких как мьютексы, блокировки чтение-запись, условия ожидания или семафоры. Программы, написанные с помощью QtConcurrent, автоматически регулируют количество используемых потоков в соответствии с количеством доступных ядер процессора. Это означает, что приложения, написанные сегодня, будут продолжать масштабироваться при развертывании в многоядерных системах в будущем.

ВАУ! круто. вот оно, мечта!!1
жаль что говно (
5 апр 21, 17:09    [22304664]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,
))))
>жаль что говно (
Верю что транзакции в банке напишешь надежнее на тетрисе)))
5 апр 21, 17:13    [22304667]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
бабушкин зайчик
Dima T
Я ссылки давал выше 22304501, почитал? Почитай хотя бы статью на хабре.

обязательно прочитаю, но позже.
Так я и написал, что не залочится. Это то я понимаю. Я не понимаю, зачем мне мутекс в таком случае...
Надеюсь хабр даст ответ.

Потом и поговорим. О чем говорить если ты матчасть изучать не собираешься. Пиши однопоточно, иначе накосячишь.

И про кучу векторов ты неверно совет mayton`а расширил, он всего лишь предложил вынести флаг свободной ячейки в vector<bool>. Это не значит что если у тебя N полей надо N векторов.
Просто vector<bool> особенный, в нем 1 бит на значение, а тип bool - 1 байт. Экономия памяти в 8 раз.
5 апр 21, 17:34    [22304679]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
petrav
Кстати, есть же концепция "множество читателей - один писатель". Только я, за ненадобностью, не помню
как её реализовать на C++. Даже названия не помню. :(

Есть такое, std::shared_mutex, но он тормоз, т.к. счетчик читателей меж кэшей всех потоков гоняется.
5 апр 21, 17:36    [22304681]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

PetroNotC Sharp
Где ище миллион вектор?

Тут: https://www.sql.ru/forum/1326703/vector-na-trillion-obektov

Posted via ActualForum NNTP Server 1.5

5 апр 21, 17:48    [22304689]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
Dima T
Потом и поговорим. О чем говорить если ты матчасть изучать не собираешься.

не было такого. Просто нет смысла её читать, если сутки не спал. Всё равно перечитывать потом.
про vector<bool> говорят: "is a mess. DON't USE IT!"
а тут:
автор
std::vector<bool> behaves similarly to std::vector, but in order to be space efficient, it:
Does not necessarily store its elements as a contiguous array.
Exposes class std::vector<bool>::reference as a method of accessing individual bits. In particular, objects of this class are returned by operator[] by value.
Does not use std::allocator_traits::construct to construct bit values.
Does not guarantee that different elements in the same container can be modified concurrently by different threads.

уверен, что это хорошая мысль?
Dimitry Sibiryakov
Тут: https://www.sql.ru/forum/1326703/vector-na-trillion-obektov

интересно, но там больше про БД
а вообще не мой случай
6 апр 21, 00:15    [22304851]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
бабушкин зайчик
Member

Откуда: сетевой
Сообщений: 61
вот мой случай
за исключением того, что там 2 потока работают с разными кусками вектора (0-10 и 10-20), поэтому проблемы нет
а у меня оба работают с 0-20 и проблема есть
Проблема в том, что mutex берется первым потоком, а второй поток не может работать, пока он не будет освобожден.

Таким образом, по сути, вы получаете многопоточное приложение, в котором все потоки выполняют свою работу последовательно.

Вы можете переместить свою охрану в for-loop

for(int i=start; i<end; i++) {
  std::lock_guard<std::mutex> guard(mtx);
  vec[i] = i;
}

Это даст потокам возможность работать вместе над пройденным вектором.

BUT:

Вы должны принять во внимание, что несколько потоков не всегда дают производительность boost jut, потому что параллелизм != параллелизм .

Я бы ожидал, что это приложение таким образом будет на самом деле медленнее, чем однопоточная реализация, потому что следующее:
    Потоки блокируют друг друга с помощью mutex , поэтому одновременно работает только один поток
    Вы тратите время на переключение контекста между потоками

ИДЕЯ РЕШЕНИЯ:
Если вы хотите запустить его действительно параллельно, вам нужно заставить потоки работать с независимыми данными, а затем объединить результат.

у меня потоки нужны для чтения, а на запись операций в разы меньше
поэтому можно было бы либо лочить вектор просто (его ведь читать можно будет?), но это затраты, как выше описано
либо запись делать одним потоком (если можно одновременно в многопоточном приложении такое сделать?
По идее можно, ведь я могу внутри ф-и, которая вызывается на событии, сделать разделение на чтение/запись и параллелить только чтение...)
(ушёл читать хабр)

Сообщение было отредактировано: 6 апр 21, 02:09
6 апр 21, 02:11    [22304862]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
Dima T
Member

Откуда:
Сообщений: 15689
бабушкин зайчик
автор
Does not guarantee that different elements in the same container can be modified concurrently by different threads.

уверен, что это хорошая мысль?

От того что в описании вектора подобное не написано не означает что с ним можно работать многопоточно без синхронизации. Я об этом уже писал 22304542

Можно работать многопоточно без синхронизации только если разработчик явно об этом заявляет. Ключевое слово threadsafe (потокобезопасно). Например ConcurrentDictionary в C#.
6 апр 21, 07:28    [22304873]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
бабушкин зайчик,
>у меня потоки нужны для чтения, а на запись операций в разы меньше
= где обоснование что они нужны если кода нет и ты их не писал в жизни?
Вполне можно взять Фоновый Один поток и пусть работает тихо и незаметно.
Если одним писать и другим читать, то это и есть подводные камни.
6 страниц а ты до сих пор ничего не понял.
6 апр 21, 08:01    [22304878]     Ответить | Цитировать Сообщить модератору
 Re: как обнулить ячеку вектора (не удаляя)?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
У меня - есть стойкое убеждение, что подобного рода споры не имеют смысла без макета исходного кода.

Я закрываю этот топик.

В следующий раз - приводите код.
6 апр 21, 08:50    [22304893]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 [6]      все
Все форумы / C++ Ответить