Я думаю, что это общая проблема. Например, у меня есть массив, который модифицируется одним процессом/нитью:
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();
Есть ли какие-либо лучшие подходы для печати всего массива?
Если это часть печати, которая занимает много времени, вы можете взять блокировку, взять копию массива, отпустить блокировку и распечатать копию массива.
Какие блокировки вы используете, мьютекс? Какую же последовательность вы ожидаете между отдельными ячейками в вашем массиве, когда (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();
}
Однако, если семантика вашего массива такова, что ячейки не независимы друг от друга, но вам нужна атомарная согласованность по массиву, вы застряли в своей первоначальной глобальной блокировке.
Однако вы все равно можете взять копию массива под блокировкой, а затем распечатать копию, так как это сохранит блокировку массива за меньшее время, не дожидаясь печати.
std::atomic
.