What does it mean that a value can only be incremented after it's been loaded into a register?
Here are some more concepts to help with this.

CPUs use load and store instructions to execute the high level language concept of tally++;.  This is not atomic, unlike atomic CPU operations such as read-modify-write.

This question is alluding to the fact that there is no atomicity and that the common set of instructions can be executed in any interleaving by the $n$ processes.

The "lost update" concept is the enemy here. Wikipedia's "Concurrency control" article talks about this but mostly in a database transaction sense. Nevertheless it is absolutely the same high level concept of:


Thread1 reads tally into register (likely the ALU) (observes 6)
Thread2 reads tally (observes 6)
Thread1 increments ALU (now is 7)
Thread2 increments ALU (now is 7)
Thread1 writes ALU to tally memory (value stored is 7)
Thread2 writes ALU to tally memory (value stored is 7)


So BOTH threads/processes/whatever have "incremented" tally but the shared memory value of tally is ONLY 1 larger than when it started. Thread2's write to memory caused a lost update; Thread1's write was "lost".

By setting the question to say that there are at least three instructions required to increment (i.e. tally++;) the asker is saying that it is entirely possible that lost updates can occur due to interleaving of the instructions by multiple processes and causing lost updates.

I'd say the lower bound of tally is 50 (maximum destructive interleavings occur).
Upper bound is 50 * numProcesses (where no unscrupulous interleavings of the increment code occur).

Concepts to look up are:


Shared memory concurrency/parallel
Atomic and non-atomic instructions like load store and read modify write
Interleaving of instructions
Lost update