указатели массива, которые не меняют размер.Мне нужны замки? - PullRequest
0 голосов
/ 30 января 2019

Я использую потоки для увеличения скорости моей программы.

В результате у меня теперь есть 8 bitset<UINT64_MAX> битовых наборов.Я планирую создать 8 отдельных потоков, каждый из которых отвечает за установку и проверку своего набора битов, который определяется индексом, передаваемым каждому потоку.

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

Вот пример моего кода:

#define NUM_CORES 8
class MyBitsetClass {

public:
   bitset<UINT64_MAX> bitsets[NUM_CORES];
   thread threads[NUM_CORES];

   void init() {

       for (uint8_t i = 0; i < NUM_CORES; i++) {
           threads[i] = thread(&MyBitsetClass::thread_handler, this, i);
       }
       ... do other stuff
   }

   void thread_handler(uint8_t i){
       // 2 threads are never passed the same i value so they are always 
       // modifying their 'own' bitset. do I need a mutex?
       bitsets[i].set(some_index);
   }
}

Ответы [ 2 ]

0 голосов
/ 30 января 2019

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

Нет;Пока каждый поток использует отдельный элемент массива, синхронизация не требуется.

Однако доступ к этому массиву может быть эффективно сериализован, если наборы битов невелики, из-за «ложного совместного использования», вызванного доступом кта же строка кэша из нескольких потоков.Это не будет проблемой, если потоки тратят лишь небольшое количество времени на доступ к массиву, например, пишут только в самом конце дорогих вычислений.

bitset<UINT64_MAX> не маленький.8 из этих наборов битов - это всего 16 байт Exa.Я надеюсь, что вы получили хорошую сделку при поиске оборудования:)

0 голосов
/ 30 января 2019

нужно ли использовать мьютексы?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...