Critical section uses a shared variable so any case you have multiple threads writing to a variable you should have a critical section, it’s very general. I don’t have much experience with reduction but it seems geared towards all loops preforming the same function as part of a larger function and they take approximately the same amount of time to complete plus are expected to start and end together. Something like parallelizing an integral by spliting it into ranges would be simpler with reduction. Also if the threads need to read and write to the global, seems like that would need a critical section.
Sometimes it’s just like monkeys on typewriters