powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / как обнулить ячеку вектора (не удаляя)?
21 сообщений из 146, страница 6 из 6
как обнулить ячеку вектора (не удаляя)?
    #40059913
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
Dima T
Я ссылки давал выше 22304501 , почитал? Почитай хотя бы статью на хабре.

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

Метод в векторе Добавить сначала запишет объект а потом увеличит счетчик Count.
Если два потока сразу, то эти две строки пемешаются.
Райзе будет.
Так понятно?
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059914
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще про fairness не говорили.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059915
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,
Шо будет если строки перемешать?))))
Код: plaintext
1.
2.
3.
public void deleteLast(Vector list) {
    int lastIndex = list.size() - 1;
    list.remove(lastIndex);


Давай уж код начнем писать)))
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059923
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Самый простой способ Не блокирования это клонирование коллекции или ее куска.
Широко применяется. Нет никаких особых последствий.
И никаких мьютексов.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059925
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я предлагаю обсудить кто первый получит доступ к g_mutex после того как самый первый поток его отпускает.

Код: plaintext
1.
2.
3.
4.
5.
6.
{
   // in thread 1
   lock(g_mutex);
   // very long action
   unlock(g_mutex);
}




Код: plaintext
1.
2.
3.
4.
{
   // in thread 2
   lock(g_mutex);
}



Код: plaintext
1.
2.
3.
4.
{
   // in thread 3
   lock(g_mutex);
}
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059929
PetroNotC Sharp
бабушкин зайчик
пропущено...

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

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

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

Я тут придумал вот чё: а шо если держать несколько ф-й, каждая из которых пишет в диапазон ячеек...
ф1 = 0-9999
ф2 = 10000-19999
(you got the idea)
И вот ИХ лочить?
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059934
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик


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


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

И не забывай про DWORD/ia32.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059937
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,
В java лочатся все публичные методы для вектора с названием фабричного метода Collections.synchronizedXxxxx
Но есть и штук 30 других коллекций.
...
Если диапазон, то лочить не надо. Каждому потоку по тарелке
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059938
mayton
Это идеальный параллелизм. Shared Nothing.

ну вообще-то шанс то остаётся, что 2 потока залезут в одну ячейку
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059939
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТС, идите в..... Qt!
Чем вы будете лисапед писать первый раз в жизни.
авторQtConcurrent имен предоставляет API - интерфейсы высокого уровня , которые делают возможным написание многопоточных программ без использования низкоуровневых поточных примитивов , таких как мьютексы, блокировки чтение-запись, условия ожидания или семафоры. Программы, написанные с помощью QtConcurrent, автоматически регулируют количество используемых потоков в соответствии с количеством доступных ядер процессора. Это означает, что приложения, написанные сегодня, будут продолжать масштабироваться при развертывании в многоядерных системах в будущем.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059940
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
mayton
Это идеальный параллелизм. Shared Nothing.

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

Мне бабушка говорила
- Не ешь с пола.
- Одевай зимой шерстяные штаны.
- И выравнивай доступ к памяти по регистру.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059945
mayton
- И выравнивай доступ к памяти по регистру.

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

ВАУ! круто. вот оно, мечта!!1
жаль что говно (
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059948
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,
))))
>жаль что говно (
Верю что транзакции в банке напишешь надежнее на тетрисе)))
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059950
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
Dima T
Я ссылки давал выше 22304501 , почитал? Почитай хотя бы статью на хабре.

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

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

И про кучу векторов ты неверно совет mayton`а расширил, он всего лишь предложил вынести флаг свободной ячейки в vector<bool>. Это не значит что если у тебя N полей надо N векторов.
Просто vector<bool> особенный, в нем 1 бит на значение, а тип bool - 1 байт. Экономия памяти в 8 раз.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059951
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Кстати, есть же концепция "множество читателей - один писатель". Только я, за ненадобностью, не помню
как её реализовать на C++. Даже названия не помню. :(

Есть такое, std::shared_mutex, но он тормоз, т.к. счетчик читателей меж кэшей всех потоков гоняется.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40059958
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC SharpГде ище миллион вектор?

Тут: https://www.sql.ru/forum/1326703/vector-na-trillion-obektov
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40060030
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.
уверен, что это хорошая мысль?

интересно, но там больше про БД
а вообще не мой случай
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40060036
вот мой случай
за исключением того, что там 2 потока работают с разными кусками вектора (0-10 и 10-20), поэтому проблемы нет
а у меня оба работают с 0-20 и проблема есть
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Проблема в том, что mutex берется первым потоком, а второй поток не может работать, пока он не будет освобожден.

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

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

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

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

BUT:

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

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

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


у меня потоки нужны для чтения, а на запись операций в разы меньше
поэтому можно было бы либо лочить вектор просто (его ведь читать можно будет?), но это затраты, как выше описано
либо запись делать одним потоком (если можно одновременно в многопоточном приложении такое сделать?
По идее можно, ведь я могу внутри ф-и, которая вызывается на событии, сделать разделение на чтение/запись и параллелить только чтение...)
(ушёл читать хабр)
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40060044
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
автор Does not guarantee that different elements in the same container can be modified concurrently by different threads.

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

Можно работать многопоточно без синхронизации только если разработчик явно об этом заявляет. Ключевое слово threadsafe (потокобезопасно). Например ConcurrentDictionary в C#.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40060046
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,
>у меня потоки нужны для чтения, а на запись операций в разы меньше
= где обоснование что они нужны если кода нет и ты их не писал в жизни?
Вполне можно взять Фоновый Один поток и пусть работает тихо и незаметно.
Если одним писать и другим читать, то это и есть подводные камни.
6 страниц а ты до сих пор ничего не понял.
...
Рейтинг: 0 / 0
как обнулить ячеку вектора (не удаляя)?
    #40060057
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня - есть стойкое убеждение, что подобного рода споры не имеют смысла без макета исходного кода.

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

В следующий раз - приводите код.
...
Рейтинг: 0 / 0
21 сообщений из 146, страница 6 из 6
Форумы / C++ [игнор отключен] [закрыт для гостей] / как обнулить ячеку вектора (не удаляя)?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]