блокировка и работа занимает много времени

0

Я думаю, что это общая проблема. Например, у меня есть массив, который модифицируется одним процессом/нитью:

lock();
for(int i; i<array_size; i++) {
    // find an item and do some operations
}
unlock();

Существует еще один процесс/поток, который время от времени печатает весь массив, но может потребоваться "длинное" время:

lock()
for(int i; i<array_size; i++) {
    print(array[i]);
}
unlock();

Есть ли какие-либо лучшие подходы для печати всего массива?

Теги:
multithreading
locking

2 ответа

3

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

  • 0
    Это, конечно, выполнимо для небольших массивов быстро копируемых типов, но если во время выполнения это похоже на печать ...
1

Какие блокировки вы используете, мьютекс? Какую же последовательность вы ожидаете между отдельными ячейками в вашем массиве, когда (1) обновите их и (2) при печати? Если каждая ячейка массива независима, то почему не просто еще много блокировок, каждый из которых несет ответственность только за эти ячейки?

Подобно;

mutex locks[array_size];
for (int i=0; i< mutex_size; i++) {
   locks[i].lock();
    // do something or print content...
   locks[i].unlock();   
}

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

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

  • 0
    Если согласованность между элементами массива не важна, можно даже использовать типы массивов std::atomic .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню